Apache 如何删除多个尾部斜杠?

Apache 如何删除多个尾部斜杠?,apache,.htaccess,mod-rewrite,url-rewriting,slash,Apache,.htaccess,Mod Rewrite,Url Rewriting,Slash,以下是我的重写规则: ########### # Rewrite # ########### # Settings RewriteEngine On RewriteBase / # Cache Busting RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_URI} "^(.+)\.\d+\.(css|js)$" [NC] RewriteRule "^.*$

以下是我的重写规则:

###########
# 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]
一切正常(不管怎样,任何关于提高性能或更好的regexp的建议都是受欢迎的),但我遇到了一个奇怪的情况,我不明白这是由我的重写规则还是由默认的Apache行为产生的。 如果我的URL以“/”结尾,我可以在不重写的情况下附加任意多的斜杠

例如,如果在我的地址栏中插入以下内容:

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

所有这些斜线都没有被删除。我仍然看到我的index.php页面。 如果我插入以下地址:

http://[MY-HOST-NAME]/members///

所有这些多个斜杠都没有被删除,我可以看到我的members index.php页面。 等等


有人能帮我吗?非常感谢

Gerbens的答案适用于.htaccess,但不适用于全局配置。
RewriteCond %{THE_REQUEST} //
RewriteRule .* $0 [R]
这一个在发送重定向之前删除所有斜杠

# 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]

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]

那么,究竟哪条规则应该重写斜杠,为什么?(我不会把太多的斜杠视为“用户错误”,但…)这有什么关系?如果你的网站没有添加额外的尾部斜杠,那就不用担心了。为什么要浪费额外的HTTP请求来删除用户手动添加的额外斜杠,而这些斜杠最终对显示的页面没有影响?为什么这对我来说很重要呢?如果你有一个解决方案,那就把它贴出来。如果你没有,就不要回答。我之所以要它,是因为我看到大量机器人同时请求“/”和“/”(包括谷歌机器人),这会使我的索引页面在seach引擎中被索引两次。不是很友好的搜索引擎优化。不需要个人。根据你提供的信息,我也会回答同样的问题。所有的网站都有同样的问题,即使是google()。你应该把评论中的信息添加到原来的帖子中。但要回答您的问题,搜索引擎之所以用多余的斜杠来爬行URL,很可能是因为html中的URL有双斜杠。搜索引擎通常不会猜测URL。此外,搜索引擎足够聪明,知道这些URL很可能是相同的意思。就像他们知道
/
可能与
/index.php
相同一样。那么,到底哪条规则应该重写斜杠,为什么?(我不会把太多的斜杠视为“用户错误”,但…)这有什么关系?如果你的网站没有添加额外的尾部斜杠,那就不用担心了。为什么要浪费额外的HTTP请求来删除用户手动添加的额外斜杠,而这些斜杠最终对显示的页面没有影响?为什么这对我来说很重要呢?如果你有一个解决方案,那就把它贴出来。如果你没有,就不要回答。我之所以要它,是因为我看到大量机器人同时请求“/”和“/”(包括谷歌机器人),这会使我的索引页面在seach引擎中被索引两次。不是很友好的搜索引擎优化。不需要个人。根据你提供的信息,我也会回答同样的问题。所有的网站都有同样的问题,即使是google()。你应该把评论中的信息添加到原来的帖子中。但要回答您的问题,搜索引擎之所以用多余的斜杠来爬行URL,很可能是因为html中的URL有双斜杠。搜索引擎通常不会猜测URL。此外,搜索引擎足够聪明,知道这些URL很可能是相同的意思。就像他们知道
/
可能和
/index.php
一样。该死!世界可以如此简单。:-)在Apache中也不适用于我-我被重定向到服务器上htdocs的路径。在这种情况下,我认为您需要指定一个
RewriteBase
。如果htaccess位于根目录中,则类似于
RewriteBase/
。该死!世界可以如此简单。:-)在Apache中也不适用于我-我被重定向到服务器上htdocs的路径。在这种情况下,我认为您需要指定一个
RewriteBase
。如果htaccess位于根目录中,则类似于
RewriteBase/
# rule 1: remove multiple leading slashes (directly after the TLD)
RewriteCond %{THE_REQUEST} \s/{2,}
RewriteRule (.*) $1 [R=301,L]

# rule 2: remove multiple slashes in the requested path
RewriteCond %{REQUEST_URI} ^(.*)/{2,}(.*)$
RewriteRule (.*) %1/%2 [R=301,L]