Apache mod_rewrite에서 [L]과 [END] 플래그가 다르게 동작하는 경우
조회 0 · 댓글 0
.htaccess에 RewriteRule을 걸어두고 [L]로 끝냈는데 재작성된 URL이 다시 규칙 맨 위로 돌아와 루프가 도는 경험을 한 적이 있다면 이 팁이 유용합니다. 서버나 VirtualHost 컨텍스트에서는 두 플래그가 동일하게 동작하지만, per-directory(.htaccess) 컨텍스트에서는 다릅니다.
공식 문서 설명을 그대로 옮기면, [L]은 현재 규칙 처리 패스를 멈추지만 재작성된 요청이 다시 규칙 맨 위부터 재처리될 수 있어 루프가 생길 수 있습니다. [END]는 현재 라운드뿐 아니라 per-directory 컨텍스트에서의 이후 모든 재작성 처리를 막아 이 재진입 자체를 끊습니다. 그래서 문서는 대부분의 per-directory 규칙에는 [END]를 권장한다고 적고 있습니다.
# .htaccess - 재작성 후 재진입을 막으려면 END
RewriteEngine On
RewriteRule ^old/(.*)$ /new/$1 [R=301,END]주의할 점 하나. [END]는 Apache 2.3.9 이상에서만 쓸 수 있습니다. 구형(2.2 이하)에서는 이 플래그가 없으므로 조건으로 재진입을 걸러내는 방식으로 루프를 피해야 합니다.
로그인 후 답글을 남길 수 있습니다.