2012-02-15 2 views
2

Apache 리디렉션에 약간의 문제가 있습니다. 사이트에서 임의의 페이지에 대해 벨로우즈 규칙이 작동하는 동안 mydomain.com은 후행 슬래시 제거 규칙을 무시하는 mydomain.com//으로 리디렉션됩니다.www가 아닌 ​​www로 리디렉션하면 후행 백 슬래시가 제거되지 않습니다.

또한 이와 같은 여러 규칙을 사용하는 것이 효율적입니까? 아니면 하나의 URL에 여러 번 리디렉션되지 않도록하기 위해 어떻게 결합하거나 연결해야합니까?

감사

당신이 있기 때문에
#Turn on options for url rewriting 
     Options +FollowSymlinks 
     RewriteEngine on 

#lovercase all urls 
     RewriteMap lc int:tolower 
     RewriteCond %{REQUEST_URI} [A-Z] 
     RewriteCond %{REQUEST_URI} ^/fonts/.* 
     RewriteCond %{REQUEST_URI} ^/css/.* 
     RewriteCond %{REQUEST_URI} ^/js/.* 
     RewriteRule (.*) ${lc:$1} [R=301,L] 

#redirect all requests made to http:// to http://www. 
     RewriteCond %{HTTP_HOST} ^mydomain\.com$ [NC] 
     RewriteRule ^(.*)$ http://www.mydomain.com/$1 [R=301,L] 

#removes trailing slash 
     RewriteCond %{REQUEST_FILENAME} !-f 
     RewriteCond %{REQUEST_FILENAME} !-d 
     RewriteCond %{HTTP_HOST} !^\.localhost$ [NC] 
     RewriteRule ^(.+)/$ http://%{HTTP_HOST}$1 [R=301,L] 
+0

은 .htaccess 파일 또는 server/vhost 구성의 이러한 규칙입니까? –

+0

그들은 주 아파치 설정 파일에 있습니다. –

답변

4

mydomain.comwww.mydomain.com//로 리디렉션됩니다 이유는 별도의 "/"당신의 다시 쓰기 규칙 대상에서 :

RewriteRule ^(.*)$ http://www.mydomain.com/$1 [R=301,L] 
              ^----here 

당신이 당신의 서버에서 규칙을

/vhost 설정에서 선행 슬래시는 제거되지 않으므로 일치하고 역 참조로 사용되므로 mydomain.com^(.*)$과 일치하고 http://www.mydomain.com//과 일치하는 /입니다. 그래서 당신도 대상에 슬래시를 제거하거나 정규식에 하나를 추가 할 수 있습니다

RewriteRule ^(.*)$ http://www.mydomain.com$1 [R=301,L] 
or 
RewriteRule ^/(.*)$ http://www.mydomain.com/$1 [R=301,L] 

귀하의 다른 규칙은, 당신은 :

 RewriteCond %{REQUEST_FILENAME} !-f 
    RewriteCond %{REQUEST_FILENAME} !-d 
    RewriteCond %{HTTP_HOST} !^\.localhost$ [NC] 
    RewriteRule ^(.+)/$ http://%{HTTP_HOST}$1 [R=301,L] 

가 정상입니다. 뒤에 오는 슬래시를 제거하기위한 것입니다. (.+) 때문에 /something/입니다. 그것은 본질적으로 단지 /으로 바뀌기 때문에 어쨌든 //과 일치하지 않을 것입니다. http://www.mydomain.com//

+0

감사합니다. 완벽하게 작동합니다. 슬프게도 저는 여기에서 여전히 새로운 사람입니다. 그래서 당신에게 많은 투표권을 줄 수는 없습니다. T_T –

관련 문제