htaccess 규칙을 알 수 없습니다


9

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

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

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


요청 부분 ( ".com"다음의 URL 부분)이 a로 끝나지 /않고 " ."를 포함하지 않는 경우 요청을에 추가하여 리디렉션하십시오 /. 이 규칙의 가능한 의도는 자동 디렉토리 색인 작성을 처리하는 것입니다.
peterh-Reinstate Monica

답변:


11

이 규칙이하는 모든 후행를 추가하는 것입니다 /존재하지 않는 경우 귀하의 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]

" /test.case/folder도 리디렉션되지 않습니다"-부. 그러나 "폴더"가 파일 시스템 디렉토리 인 경우 mod_dir은 기본적으로 후행 슬래시를 추가하기 위해 301 리디렉션을 발행합니다. /test.case/some-other-virtual-url후행 슬래시가 있어야하는 경우에만 문제가됩니다 .
MrWhite

6

유효성 검사는 없지만 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]

!(\/$|\.[^\/]*)-업데이트 된 정규 표현식은 실제로 다르지 않습니다. 두 번째 부분 (확장자와 일치하는)에도 문자열 끝 앵커가 필요합니다. 아마도 다음과 같습니다 : !(/|\.[a-zA-Z]+)$(슬래시를 벗어날 필요가 없습니다).
MrWhite

@MrWhite Good catch! 내 답변을 업데이트했습니다!
Joffrey
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.