2012-02-15 62 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配置中? – 2012-02-15 09:07:45

+0

他們在主要的Apache配置文件。 – 2012-02-15 09:22:39

回答

4

mydomain.com被重定向到www.mydomain.com//的原因是因爲你有一個額外「/」在你的重寫規則目標:

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

當你在你的服務器規則/ vhost config,不刪除前導斜槓以便匹配並用作反向引用,因此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 – 2012-02-15 11:43:14