htaccess 규칙을 알 수 없습니다 규칙의 특성상 검색도 도움이되지 않습니다. RewriteCond

내 htaccess 에이 기능이 있지만 그 기능을 파악할 수 없습니다. 규칙의 특성상 검색도 도움이되지 않습니다.

RewriteCond %{REQUEST_URI} !(/$|\.)
RewriteRule (.*) %{REQUEST_URI}/ [R=301]

누구든지 그 내용을 설명해 주시겠습니까?



답변

이 규칙이하는 모든 후행를 추가하는 것입니다 /존재하지 않는 경우 귀하의 URL로 더있는 경우 .URI를에, 그래서 https://example.org/test리디렉션되지 않습니다 https://example.org/test/, 그러나 https://example.org/test.html에 다시 쓸 수 없습니다 https://example.org/test.html/(그러나 참고 : https://example.org/test.case/folder또한 할 수 없습니다 로 리디렉션 https://example.org/test.case/folder/에 포함로 .URI에서 a ).

## Do the following if the URI does not end with `/` or  does not contain an `.`:
## the . is relevant for file names like test.html, which should n
RewriteCond %{REQUEST_URI} !(/$|\.)

## Redirect it to the original URI with an added `/` and mark this as permanent:
RewriteRule (.*) %{REQUEST_URI}/ [R=301]

답변

유효성 검사는 없지만 Apache 재 작성 경험을 사용하면이 구성은 다음과 같습니다.

  1. URI, 서버, 포트 또는 쿼리 매개 변수가 아닌 ‘path’부분에서 일치합니다 (예 : ‘/my/location/file.html’).
  2. 이 부분이 ‘/'(슬래시) 문자로 끝나지 않거나 ‘.’를 포함하지 않으면 일치합니다. (점) 문자.
  3. URI의 전체 경로 부분을 사용하고 슬래시를 추가하십시오.
  4. 브라우저를이 새로운 URI로 보내려면 HTTP 301 (영구적) 리디렉션을 보내십시오.

다음과 같은 테스트 사례가 발생합니다.

/ -> /
/test -> /test/
/my/resource -> /my/resource/
/my/resource.type -> /my/resource.type
/edge.case/resource -> /edge.case/resource

따라서 규칙에는 파일이 아닌 리소스에 슬래시를 추가하는 것이 목적이라고 생각하지만 엣지 케이스가있는 것 같습니다.

‘.’를 사용하여 자원에 슬래시를 추가하지 않으면 경로의 파일이 아닌 부분의 (도트) 문자는 정규식을 다음과 같이 변경해야합니다.

# match paths which do not end with a slash, or do not resemble a file with an extension
RewriteCond %{REQUEST_URI} !(/$|\.[^/]+$)
# redirect permanently to the same uri with a slash
RewriteRule (.*) %{REQUEST_URI}/ [R=301]