我使用以下 htaccess 规则从 Web url 中删除双斜杠或更多斜杠:
#remove double/more slashes in url
RewriteCond %{REQUEST_URI} ^(.*)//(.*)$
RewriteRule . %1/%2 [R=301,L]
这对于 uri 中间出现的斜杠来说效果很好,例如,如果使用 url:
http://demo.codesamplez.com/html5//audio
它被重定向到正确的单斜杠网址:
http://demo.codesamplez.com/html5/audio
但是,如果 url 开头包含双斜杠,就在域名之后,则它不起作用,例如:
http://demo.codesamplez.com//html5/audio
它没有被重定向。
如何修复上述规则以适用于此类网址?谢谢。
尝试一下:
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s/{2,} [NC]
RewriteRule ^(.*) $1 [R=301,L]
它应该重定向到域末尾的单个斜杠。 以及对你的改进:
RewriteCond %{REQUEST_URI} ^(.*)/{2,}(.*)$
RewriteRule . %1/%2 [R=301,L]
对我来说,以下规则非常有效:
<IfModule mod_rewrite.c>
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]
</IfModule>
这个想法很大程度上基于 Marcels 的答案(谢谢!),但是这个更轻量级,并且包含
RewriteBase
,如果您使用特定的子目录结构,这可能会有所帮助。此外,马塞尔的回答缺乏解释,我想解决这个问题:
规则 1:
{THE_REQUEST}
包含类似 GET /index.html HTTP/1.1
的内容(请参阅 docs)。因此,如果我们匹配第一个空格 (\s
) 后跟多个斜杠 (/{2,}
),我们就可以通过 $1
访问正确的 URL,而无需前导双斜杠。
规则 2:正则表达式
^(.*)/{2,}(.*)$
将请求 URI 拆分为多个斜杠。 %1/%2
然后再次组合两个分割的字符串,但此时只有一个斜杠。
按照这个 链接,下面的代码应该处理 URL 中额外的斜杠(任何地方)。
RewriteCond %{THE_REQUEST} //
RewriteRule ^.*$ $0 [R=302,L,NE]
为了防止网址中出现长时间重复的字符,例如:
http://demo.codesamplez.com/html5///////////////////////////////////////////audio
你可以这样做:
RewriteCond %{REQUEST_METHOD} !=POST
RewriteCond %{REQUEST_URI} ^(.*?)(/{2,})(.*)$
RewriteRule . %1/%3 [R=301,L]
它应该适用于:
http://demo.codesamplez.com//html5/audio
使用一小段 .htaccess 即可轻松解决这种情况。您需要做的就是复制以下代码和您网站的根
.htaccess
文件:
<IfModule mod_rewrite.c>
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]
</IfModule>
规则 1:
{THE_REQUEST}
包含类似 GET /index.html HTTP/1.1
的内容
因此,如果我们匹配第一个空格
(\s)
后跟多个斜杠(/{2,})
,我们就可以通过$1
访问正确的URL,而无需前导双斜杠。
规则 2: 正则表达式
^(.*)/{2,}(.*)$
将请求 URI 拆分为多个斜杠。 %1/%2
然后再次组合两个分割的字符串,但此时只有一个斜杠。
例如,该指令将重定向如下:
https://www.meysmahdavi.com// 重定向至 https://www.meysmahdavi.com/ https://www.meysmahdavi.com//blog-post/ 重定向至 https://www.meysmahdavi.com/blog-post/ https://www.meysmahdavi.com//path/directory/ 重定向至 https://www.meysmahdavi.com/path/directory/
所以基本上它会从任何 URL 中删除双斜杠。
只需将以下代码放入您的 .htaccess 文件中。 它将从任何地方删除多个斜杠。位于网址末尾和网址中间。
<IfModule mod_rewrite.c>
RewriteBase /`enter code here`
RewriteCond %{THE_REQUEST} \s[^?]*//
RewriteRule ^.*$ /$0 [R=302,L,NE]
#Remove slash anywhere from url
RewriteCond %{REQUEST_URI} ^(.*)//(.*)$
RewriteRule . %1/%2 [R=301,L]
# 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`enter code here`
RewriteCond %{REQUEST_URI} ^(.*)/{2,}(.*)$
RewriteRule (.*) %1/%2 [R=301,L]
</IfModule>
这里有一个细微的变化,我发现当你有一个 .htaccess 文件和许多子目录时效果更好:
# Remove multiple slashes anywhere in url
# rule 1: Remove multiple leading slashes directly after the domain name
RewriteCond %{THE_REQUEST} \s/{2,}
RewriteRule (.*) $1 [R=301,L]
# rule 2: Remove multiple slashes anywhere in the rest of the path
RewriteCond %{THE_REQUEST} \s/+(.*?)/{2,}([^\s]*)
RewriteRule ^ %1/%2 [R=301,L,NE]
一次删除多个斜杠
RewriteCond %{REQUEST_METHOD} GET
RewriteCond %{THE_REQUEST} (\s/{2,}.*)|(\s/.+//.*)
RewriteRule (.*) $1 [QSA,R=301,L]