-2

基于此处找到的代码:删除多个尾部斜杠 mod_rewrite

我有以下 htaccess

Options +FollowSymLinks
DirectorySlash Off
RewriteEngine on
RewriteOptions inherit
RewriteBase /

#
# remove multiple slashes from url
#
RewriteCond %{HTTP_HOST} !=""
RewriteCond %{THE_REQUEST} ^[A-Z]+\s//+(.*)\sHTTP/[0-9.]+$ [OR]
RewriteCond %{THE_REQUEST} ^[A-Z]+\s(.*/)/+\sHTTP/[0-9.]+$
RewriteRule .* http://%{HTTP_HOST}/%1 [R=301,L]

#
# Remove multiple slashes anywhere in URL
#
RewriteCond %{THE_REQUEST} ^(.*)//(.*)$
RewriteRule . %1/%2 [R=301,L]

然而我发现 G-Bot 已经爬取了这个 url: http://www.example.com/aaa/bbb/////////bbb-ccc/bbb-ddd.htm。(aaa、bbb、ccc、ddd 是 url 中的关键字,请勿随意使用 - 我只是显示 url 的模式)

通过实时服务器测试上述网址,我发现斜线删除不起作用。

任何人都可以对现有代码提供任何提示或改进?谢谢

编辑 1
@Sylwester 提供了以下代码

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

它也不起作用。我仍然在 url 中看到 //////。
我已经将这组规则放在我的 htaccess 文件的最顶部,就在“RewriteBase /”的下方,以免受到其他规则的影响,但是……什么都没有。
还有什么建议吗?

4

1 回答 1

3

每个目录和 .htaccess 都很棘手,因为 apache 实际上已经为我们删除了多余的斜线。例如。//+ 不再匹配,因此我们检查 %{REQUEST_URI} 因为它具有原始 URI,而重写规则需要匹配任何内容:

# NB: Only works for per directory and .htaccess
# Needs "AllowOverride All" in global config for .htaccess 
RewriteEngine On
RewriteBase "/"

Options +FollowSymlinks
# Check if the REQUEST_URI has redundant slashes
# and redirect to self if it has (which apache has cleaned up already)
RewriteCond %{REQUEST_URI} //+
RewriteRule ^(.*) $1 [R=301,L]   

如果您可以添加全局配置,我会更喜欢在虚拟主机中使用它:

RewriteEngine On
# 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]
于 2013-06-18T19:37:47.080 回答