mod_rewrite www.site.com/dir/ --> www.site.com/dir/2009/

mod_rewrite www.site.com/dir/ --> www.site.com/dir/2009/

다시 작성하는 데 문제가 있습니다. 나는 이전에 mod_rewrite를 사용해 본 적이 없으며 정규식에 대한 경험도 많지 않습니다. 도움을 주시면 감사하겠습니다!

<IfModule mod_rewrite.c>
Options +FollowSymLinks
RewriteEngine on
#prevent nested looping
RewriteCond %{ENV:REDIRECT_STATUS} ^$
#re-route incoming requests
RewriteRule ^(.*)$ %{REQUEST_URI}2009/$1 [L,NE]
</IfModule>

이것은 부분적으로 작동합니다.http://www.site.com/dir/로 라우팅됩니다http://www.site.com/dir/2009/하지만 다음과 같은 요청은http://www.site.com/dir/css/theme.css실패합니다. 상위 디렉터리에 대한 모든 요청을 2009 하위 디렉터리로 다시 작성하고 싶지만 무한 루프와 서버 오류 메시지가 계속 나타납니다. 나는 거기에서 유용한 예를 찾지 못했습니다. 나는 이것이 일반적인 재 작성이 될 것이라고 생각했습니다 ...

미리 감사드립니다!

답변1

귀하의 예에서 다시 쓰기 규칙에는 몇 가지 문제가 있습니다. 우선, 실제로 원하는 대로 작동하지 않습니다. %{REQUEST_URI}조금도 필요하지 않습니다. /dir/css/theme.cssREQUEST_URI 와 같은 원래 경로에는 /dir/css/theme.css$1이 포함되고 css/theme.css(일치됨 (.*)) 최종 URL은 가 됩니다 /dir/css/theme.css2009/css/theme.css. 따라서 %{REQUEST_URI}RewriteRule을 따르도록 하는 부분을 제거해야 합니다.

^(.*)$ 2009/$1 [L,NE]

그것은 /dir/css/theme.css으로 번역될 것입니다 /dir/2009/css/theme.css.

그러나 해당 규칙에는 (.*)가 모든 URL과 일치하므로 무한 중첩이 발생하므로 여전히 한 가지 문제가 있습니다. 따라서 첫 번째 단계에서 예제 URL이 로 다시 작성됩니다 /dir/2009/css/theme.css. 그리고 새 URL /dir/2009/css/theme.css도 우리 규칙과 일치하므로 다시 작성되고 계속해서 다시 작성됩니다.

따라서 기본적으로 이미 다시 작성된 URL을 다시 작성하는 것을 방지하는 것이 필요합니다. 따라서 URL이 이미 포함되어 있으면 /dir/2009Apache가 이를 그대로 두기를 원합니다. 이를 달성하는 한 가지 방법은 다시 쓰기 규칙에 다음 조건을 추가하는 것입니다.

RewriteCond %{REQUEST_URI} ^(?!/dir/2009).*$

이와 같은 최종 .htaccess 파일로

<IfModule mod_rewrite.c>
    Options +FollowSymLinks
    RewriteEngine on
    RewriteBase /dir
    RewriteCond %{REQUEST_URI} ^(?!/dir/2009).*$
    #re-route incoming requests
    RewriteRule ^(.*)$ 2009/$1 [L,NE]
</IfModule>

또 다른 방법은 dir/2009 디렉토리에 .htacess 파일을 생성하여 Apache가 RewriteEngine off. 아니면 RewriteEngine on어떤 규칙도 없이 트릭을 수행해야 할 수도 있습니다.

관련 정보