通过 .htaccess 从 URL 中删除双斜杠不起作用
Removing Double Slashes From URL By .htaccess does not work
为什么 none 这些解决方案可以在我的 Apache 服务器上运行:
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s/{2,} [NC]
RewriteRule ^(.*) [R=302,L]
或
RewriteCond %{REQUEST_URI} ^(.*)/{2,}(.*)$
RewriteRule . %1/%2 [R=302,L]
或
RewriteCond %{REQUEST_URI} ^(.*)//(.*)$
RewriteRule . %1/%2 [R=302,L]
我尝试过的其他方法。
我尝试了此页面中的所有解决方案:Issue In Removing Double Or More Slashes From URL By .htaccess
以及其他页面。
问题是 htaccess 中的规则与上述模式中的双斜杠不匹配。
我还尝试了“文字”模式,使用精确的 urls 而没有正则表达式模式。依然没有。但是用一个斜线 - 所有的工作。
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}:: ^(/.+)/(.*)::$
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}/ [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 (.*) / [R=302,L]
这利用了 RewriteRule
模式 匹配的 URL-path 中已经减少了多个斜杠的事实。并且针对 THE_REQUEST
的检查(其中包含请求的第一行 headers 并且 在整个请求 中没有改变)确保多个斜线最初出现在某处URL-path(不包括查询字符串)。
另一个潜在的问题是,如果您的应用程序 (Apache) 服务器前面有一个代理服务器(或负载平衡器),这可能会规范化请求(减少多个斜杠,删除尾随 space,等等) 因为它将请求转发到您的应用程序 (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 ^(.*) [R=302,L]
这仅匹配 URL-path 的 start 处的多个斜杠,而不匹配 URL-path 中的任何位置。如果在 .htaccess
中使用,这也会导致格式错误的重定向(除非您还设置了 RewriteBase
指令)。如果 substitution 字符串上没有斜杠前缀,则此规则可能适用于 server 或 virtualhost 上下文,不是 .htaccess
.
RewriteCond %{REQUEST_URI} ^(.*)/{2,}(.*)$
RewriteRule . %1/%2 [R=302,L]
与上述使用 REQUEST_URI
的问题相同。否则,这应该有效。但是,如果存在多于一组的多个斜杠,则会导致多次重定向。例如。 //foo//bar
.
RewriteCond %{REQUEST_URI} ^(.*)//(.*)$
RewriteRule . %1/%2 [R=302,L]
与上面相同,只是只匹配双斜杠,而不是两个或多个斜杠的组。因此,如果一个组中有两个以上的斜杠,则会导致多次重定向。
为什么 none 这些解决方案可以在我的 Apache 服务器上运行:
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s/{2,} [NC]
RewriteRule ^(.*) [R=302,L]
或
RewriteCond %{REQUEST_URI} ^(.*)/{2,}(.*)$
RewriteRule . %1/%2 [R=302,L]
或
RewriteCond %{REQUEST_URI} ^(.*)//(.*)$
RewriteRule . %1/%2 [R=302,L]
我尝试过的其他方法。
我尝试了此页面中的所有解决方案:Issue In Removing Double Or More Slashes From URL By .htaccess
以及其他页面。
问题是 htaccess 中的规则与上述模式中的双斜杠不匹配。
我还尝试了“文字”模式,使用精确的 urls 而没有正则表达式模式。依然没有。但是用一个斜线 - 所有的工作。
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}:: ^(/.+)/(.*)::$
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}/ [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 (.*) / [R=302,L]
这利用了 RewriteRule
模式 匹配的 URL-path 中已经减少了多个斜杠的事实。并且针对 THE_REQUEST
的检查(其中包含请求的第一行 headers 并且 在整个请求 中没有改变)确保多个斜线最初出现在某处URL-path(不包括查询字符串)。
另一个潜在的问题是,如果您的应用程序 (Apache) 服务器前面有一个代理服务器(或负载平衡器),这可能会规范化请求(减少多个斜杠,删除尾随 space,等等) 因为它将请求转发到您的应用程序 (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 ^(.*) [R=302,L]
这仅匹配 URL-path 的 start 处的多个斜杠,而不匹配 URL-path 中的任何位置。如果在 .htaccess
中使用,这也会导致格式错误的重定向(除非您还设置了 RewriteBase
指令)。如果 substitution 字符串上没有斜杠前缀,则此规则可能适用于 server 或 virtualhost 上下文,不是 .htaccess
.
RewriteCond %{REQUEST_URI} ^(.*)/{2,}(.*)$ RewriteRule . %1/%2 [R=302,L]
与上述使用 REQUEST_URI
的问题相同。否则,这应该有效。但是,如果存在多于一组的多个斜杠,则会导致多次重定向。例如。 //foo//bar
.
RewriteCond %{REQUEST_URI} ^(.*)//(.*)$ RewriteRule . %1/%2 [R=302,L]
与上面相同,只是只匹配双斜杠,而不是两个或多个斜杠的组。因此,如果一个组中有两个以上的斜杠,则会导致多次重定向。