2011-12-10 77 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