为什么这些解决方案都不适用于我的 Apache 服务器:
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s/{2,} [NC]
RewriteRule ^(.*) $1 [R=302,L]
或
RewriteCond %{REQUEST_URI} ^(.*)/{2,}(.*)$
RewriteRule . %1/%2 [R=302,L]
或
RewriteCond %{REQUEST_URI} ^(.*)//(.*)$
RewriteRule . %1/%2 [R=302,L]
我尝试过的其他方法。
我尝试了此页面中的所有解决方案:通过 .htaccess 从 URL 中删除双斜杠或更多斜杠时出现问题
以及其他页面。
问题是 htaccess 中的规则与上述模式中的双斜杠不匹配。
我还尝试了“文字”模式,具有精确的 url,没有正则表达式模式。依然没有。但只需一个斜杠 - 一切工作。
Apache 在发现:“//”时似乎出现了问题 - url 显然无法识别并且规则被忽略。
这个想法很简单:摆脱双斜杠并用一个斜杠替换它们:
http://demo.codesamplez.com/html5//audio -> http://demo.codesamplez.com/html5/audio
你知道如何将带有双斜杠“//”的 URL 重定向到单斜杠“/”吗?
这是 htaccess (删除了文件中最长的注释):
<IfModule mod_negotiation.c>
Options -MultiViews
</IfModule>
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_URI} ^/test//slash
RewriteRule ^(.*)$ /test/slash [R=302,L]
RewriteCond %{REQUEST_URI}::$1 ^(/.+)/(.*)::\2$
RewriteRule ^(.*) - [E=BASE:%1]
# Sets the HTTP_AUTHORIZATION header removed by Apache
RewriteCond %{HTTP:Authorization} .
RewriteRule ^ - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule ^app\.php(?:/(.*)|$) %{ENV:BASE}/$1 [R=301,L]
# If the requested filename exists, simply serve it.
# We only want to let Apache serve files and not directories.
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^ - [L]
# Rewrite all other queries to the front controller.
RewriteRule ^ %{ENV:BASE}/app.php [L]
</IfModule>
在任何现有重写之前,请在根
.htaccess
文件顶部附近尝试以下操作:
# Remove multiple slashes anywhere in the URL-path
RewriteCond %{THE_REQUEST} \s[^?]*//
RewriteRule (.*) /$1 [R=302,L]
这利用了以下事实:在与
RewriteRule
pattern 匹配的 URL 路径中已经减少了多个斜杠(这就是为什么您无法使用 RewriteRule
pattern 匹配双斜杠的原因)。对 THE_REQUEST
(包含请求标头的第一行并且在整个请求中不会更改)的检查可确保 URL 路径中的某个位置最初存在多个斜杠(不包括查询字符串)。
另一个潜在的问题是,如果您的应用程序 (Apache) 服务器前面有一个代理服务器(或负载均衡器),这可能会在将请求转发到您的服务器时规范化请求(减少多个斜杠、删除尾部空格等)。应用程序(Apache)服务器。然后,应用程序服务器永远不会看到您在浏览器中看到的原始请求(带有多个斜杠)。
RewriteCond %{REQUEST_URI} ^/test//slash
RewriteRule ^(.*)$ /test/slash [R=302,L]
这个“应该”有效,仅发布了有限的示例。但是,REQUEST_URI
服务器变量在整个请求过程中都会被修改,因此如果 URL 已被修改(可能在服务器配置中),则这可能不匹配。
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s/{2,} [NC]
RewriteRule ^(.*) $1 [R=302,L]
这只匹配 URL 路径的 start 处的多个斜杠,而不是 URL 路径中的任何位置。如果在 .htaccess
中使用,这也会导致格式错误的重定向(除非您还设置了
RewriteBase
指令)。如果substitution 字符串上没有斜杠前缀,则此规则可能适用于 server 或 virtualhost 上下文,而不是
.htaccess
。
RewriteCond %{REQUEST_URI} ^(.*)/{2,}(.*)$
RewriteRule . %1/%2 [R=302,L]
与上面提到的使用REQUEST_URI
有同样的问题。否则,这应该有效。但是,如果存在多于 1 组的多个斜杠,则会导致多个重定向。例如。
//foo//bar
。
RewriteCond %{REQUEST_URI} ^(.*)//(.*)$
RewriteRule . %1/%2 [R=302,L]
与上面相同,只是这只匹配双斜杠,而不是两个或多个斜杠的组。因此,如果一组中存在两个以上斜杠,则会导致多次重定向。