RewriteRule의 위치에 따라 이중 슬래시가 발생하는 이유는 무엇입니까? 다음 코드를

모든 www 요청을 www가 아닌 ​​URL로 보내려면 다음 코드를 사용하고 있습니다.

RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.example\.org$ [NC]
RewriteRule ^(.*)$ http://example.com/$1 [R=301,L]

이것은 내 웹 사이트의 루트에있는 .htaccess 파일에서 훌륭하게 작동합니다.
예를 들어,
www.example.com-> example.com/
www.example.com/-> example.com/
www.example.com/other_page-> example.com/other_page

그러나 동일한 코드를 VirtualHost 구성으로 이동하면 다시 작성된 URL에 이중 슬래시가 포함됩니다.
www.example.com-> example.com//
www.example.com/-> example.com//
www.example.com/other_page-> example.com//other_page

다시 쓰기 규칙에서 슬래시를 제거하여 수정했습니다.

RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.example\.org$ [NC]
RewriteRule ^(.*)$ http://example.com$1 [R=301,L]

그러나 나는 그 이유를 이해할 수 없습니다. 왜 그런지 아는 사람이 있습니까?



답변

내가 이해하는 것처럼 .htaccess 파일에서 규칙에서 mod_rewrite가 처리하는 문자열은 .htaccess 파일이있는 디렉토리와 관련이 있으므로 시작시 /가 없습니다.

VirtualHost 항목에서 처리하는 문자열은 서버의 루트에 절대적이며 /도 포함합니다.

mod_rewrite의 작동 방식에 미묘한 차이가 있습니다.

비슷한 문제를 가진 사람과 해결책은 다음과 같습니다.

http://forum.modrewrite.com/viewtopic.php?p=56322&sid=77f72967f59200b5b5de174440234c3a

이스케이프를 올바르게 기억한다고 가정하면 두 경우 모두 작동해야합니다.

RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.example\.org$ [NC]
RewriteRule ^\/?(.*?)$ http://example.com/$1 [R=301,L]


답변

초기 슬래시를 캡처 한 (.*)다음 새 위치에서 다른 슬래시를 적용하기 때문에 발생합니다 /$1. mod_rewrite는 서버 별 컨텍스트가 아닌 디렉토리 별 컨텍스트에서 작동 할 때 약간 다르게 동작하기 때문에 이전에는 발생하지 않았습니다.

선택적으로 슬래시를 선점하여이를 피할 수 있습니다. 또한 잉여 도메인이있는 빈 VirtualHost에서 RedirectMatch를 사용하면 처리량이 적고 깔끔해 보일 수 있습니다.

<VirtualHost *>
ServerName example.com
ServerAlias other.example.com
..
RedirectMatch permanent ^/?(.*) http://example.com/$1
</VirtualHost>


답변

완전성을 위해이 게시물을 포함시킵니다.

아파치 문서는 이 문제가 잘 발생하고 ‘RewriteBase’지시어가 존재하는 이유입니다 이유를 설명.

.htaccess 파일에 ‘RewriteBase’지시문을 포함 시키면 원하는 결과를 얻을 수 있습니다.

예:

RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} ^www\.example\.org$ [NC]
RewriteRule ^(.*)$ http://example.com/$1 [R=301,L]

Apache 2.2 mod_rewrite 문서에서 :

RewriteBase 지시문은 디렉토리 별 다시 쓰기에 대한 기본 URL을 명시 적으로 설정합니다.

경험상 .htaccess 파일에서 거의 항상 ‘RewriteBase’를 사용하고 Apache 구성에서는 사용하지 않아야합니다.


답변

나는이 문제를 처리 할 시간이 없었기 때문에 //를 / :)로 다시 작성하십시오.

RewriteCond %{THE_REQUEST} //
RewriteRule ^(.*)$ http://domain.com [R=301,L]


답변