L 플래그에도 불구하고 Apache mod_rewrite RewriteRule 루프가 발생함

L 플래그에도 불구하고 Apache mod_rewrite RewriteRule 루프가 발생함

아파치/2.4.54.
유사한 URL(예: "/anystuff.htm")이 내부적으로는 "something.html"인 "/something"으로 외부적으로 리디렉션되도록 노력 중입니다. 그러나 다음 규칙은 중지하는 대신 루프를 발생시킵니다. 즉, "무언가"가 일치합니다.

RewriteEngine On
RewriteBase /
RewriteRule ^something$ something.html [L]
RewriteRule ^(some|thing|any|stuff).*/?$ /something [L, R=301,NC]

그러나 "L" 지시문은 효과가 없는 것 같습니다. "/something"으로의 리디렉션이 두 번째 규칙에 의해 다시 일치되어 루프가 발생하기 때문입니다.

테스트https://htaccess.madewithlove.com/예상대로 작동해야 한다고 제안합니다. 로깅을 활성화할 수 없는 것 같습니다. :-(

답변1

플래그 L는 재작성 엔진을 통한 현재 전달만 중지할 뿐, 중지하지는 않습니다.모두처리. 다음 지시문은 즉시 처리되지 않지만 (디렉터리 컨텍스트에서) 다시 쓰기 프로세스가 다시 시작됩니다... "두 번째 전달" 중에 첫 번째 규칙은 더 이상 일치하지 않지만(입력이 이제 이므로 something.html) 두 번째 규칙은 일치합니다. 그래서 리디렉션을 트리거합니다.

(재작성 엔진은 URL이 변경되지 않은 상태로 통과할 때까지 효과적으로 "루프"합니다. 지시어는섬기는 사람(디렉토리가 아닌) 컨텍스트, L다시 쓰기 엔진에 의한 단일 패스만 있기 때문에 플래그가 모든 처리를 효과적으로 중지합니다.)

그러나 Apache 2.4에서는 플래그를 END대신 사용하여 다시 쓰기 엔진에 의한 모든 처리를 중지할 수 있습니다(예배 규칙서문맥). 예를 들어:

RewriteEngine On

RewriteRule ^something$ something.html [END]
RewriteRule ^(some|thing|any|stuff) /something [R=301,NC,L]

(오류가 있었음을 주의하세요.공간두 번째 규칙의 플래그 인수에서. 이로 인해 구문 분석 오류가 발생했을 수 있으므로 귀하의 질문에 오타가 있었던 것 같습니다.)

두 번째 규칙(예: )의 후행 정규식은 .*/?$불필요합니다.

L리디렉션( 플래그)과 함께 사용하는 것은 R와 동일합니다 END. 모든 처리가 중지됩니다.

RewriteBase귀하의 예에서는 지시어가 불필요합니다 .

주의: 먼저 302(임시) 리디렉션으로 테스트하고 이것이 의도한 대로 작동하는지 확인한 후에만 301(영구) 리디렉션으로 변경해야 합니다. 301은 브라우저에 의해 지속적으로 캐시되므로 테스트에 문제가 발생할 수 있습니다. 따라서 테스트하기 전에 브라우저(및 모든 중개자) 캐시를 지워야 합니다.

테스트를 통해 https://htaccess.madewithlove.com/예상대로 작동해야 한다고 제안합니다.

실제 서버와 달리 MWL 테스터는 규칙을 통해 "단일 패스"만 (효과적으로) 수행하므로 재작성/리디렉션 루프를 감지할 수 없습니다.


곁에:일반적으로 내부 재작성 전에 외부 리디렉션 지시문을 정렬해야 합니다. 그러나 두 번째 규칙은자체적으로 리디렉션되므로 /something두 지시문은 현재 순서에 따라 달라집니다.

관련 정보