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


9

모든 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]

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

답변:


10

내가 이해하는 것처럼 .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 이전의 /를 제거하는 것보다 어떤 이유로 더 낫습니까?
davekaro 2016 년

1
낫거나 나쁘지 않은 것은 컨텍스트 차이를 처리하기 위해 매번 편집하지 않고도 VirtualHost의 .htaccess 사이를 전환 할 수있는 블록 일뿐입니다. 당신의 방법이 당신을 위해 작동한다면, 그것을 고수하십시오! :)
Neobyte

아 맞다-당신의 방법은 .htaccess와 VirtualHost에서 작동합니다. 즉 : IMO 더 잘하게
davekaro

4
@davekaro와 정확히 같은 문제가 있었고 해결책을 시도했습니다. 마지막 줄은 나를 위해 작동하지 않았습니다. RewriteRule ^/?(.*)$ http://example.com/$1 [R=301,L]트릭을했다.
Kenny Rasschaert

2

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

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

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


좋은. RedirectMatch 접근 방식이 마음에 듭니다. 실제로 달성하려는 리디렉션이기 때문에 아마도 이것과 함께 갈 것입니다.
davekaro 2016 년

1

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

아파치 문서는 이 문제가 잘 발생하고 '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 구성에서는 사용하지 않아야합니다.


0

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

RewriteCond %{THE_REQUEST} //
RewriteRule ^(.*)$ http://domain.com [R=301,L]
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.