2011-12-10 116 views
1

這裏是我的重寫規則:如果它產生如何去除多個尾部斜線?

########### 
# Rewrite # 
########### 
# Settings 
RewriteEngine On 
RewriteBase/
# Cache Busting 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_URI} "^(.+)\.\d+\.(css|js)$" [NC] 
RewriteRule "^.*$" "/%1.%2" [L] 
# No Index 
RewriteCond %{THE_REQUEST} "\ /.*index\.php.*\ " [NC] 
RewriteRule "^(.*)index\..+$" "/$1" [L,NC,R=301] 
# No Question Mark 
RewriteCond %{THE_REQUEST} "\ /[^?]*\?\ " 
RewriteRule "^(.*)$" "/$1?" [L,R=301] 
# WWW 
# RewriteCond %{HTTP_HOST} !"^(?:static|www)\.(.+)$" [NC] 
# RewriteCond %{HTTPS}s "^on(s)|" 
# RewriteRule "^(.*)$" http%2://www.%1/$1 [L,R=301] 

一切工作正常(任何建議,以改善性能和更好的正則表達式是值得歡迎的,反正),但我遇到一個奇怪的情況,我不明白通過我的重寫規則或默認的Apache行爲。 如果我的URL以「/」結尾,那麼我可以在不重寫的情況下添加儘可能多的斜線。

例如,如果在我的地址欄我插入以下:

HTTP:// [MY-HOST-NAME] //////////////// ////////////

所有這些斜槓都沒有被刪除。我仍然看到我的index.php頁面。 如果我輸入以下地址:

的http:// [MY-HOST-NAME] /會員///

所有這些多斜線不會被刪除,我可以看到我的會員index.php頁面。 依此類推...

有人可以幫我嗎?非常感謝!

+0

那麼,究竟哪些規則應該重寫斜線,爲什麼? (我不打擾和對待「用戶錯誤」太多的斜槓,但...) – 2011-12-10 21:30:51

+0

爲什麼要重要?如果*您的網站*不會添加不應該存在的額外尾部斜槓,則不必擔心。爲什麼浪費額外的HTTP請求來刪除用戶手動添加的額外斜線,這最終將不會影響顯示的頁面? – animuson

+0

爲什麼它重要,如果它對我來說很重要? 如果你有解決方案,它很好,張貼它。如果你沒有回答。我正在尋求它,因爲我看到很多請求「/」和「//」的機器人(包括Google Bot),這可以使我的索引頁在搜索引擎中被索引兩次。不是真的很友善。 –

回答

3
RewriteCond %{THE_REQUEST} // 
RewriteRule .* $0 [R] 
+0

該死!世界可以如此簡單。 :-) –

+0

@EddyFreddy如果你知道世界是如何工作的,那就是:-) – Gerben

+0

在Apache中似乎不適合我。 –

0

Gerbens的回答對.htaccess很好,但對全局配置沒有太大影響。 這一個在發送重定向之前刪除所有斜線。

# if match set environment variable and start over 
RewriteRule ^(.*?)//+(.*)$ $1/$2 [E=REDIR:1,N] 

# if done at least one. redirect with 301 
RewriteCond %{ENV:REDIR} 1 
RewriteRule ^/(.*) /$1 [R=301,L] 
0
RewriteEngine on 
RewriteBase/

#existing rule 
#remove the www. 
RewriteCond %{HTTP_HOST} ^www.website.co.uk$ [NC] 
RewriteRule ^(.*)$ http://local.website.co.uk/$1 [R=301,L] 

#new Rule 
#if its not a directory 
RewriteCond %{REQUEST_FILENAME} !-d 
#and it has a trailing slash then redirect to URL without slash 
RewriteRule ^(.+)/$ /$1 [L,R=301] 

# rest of your existing rules go here