아파치/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
두 지시문은 현재 순서에 따라 달라집니다.