我有一个像这样的正则表达式重写规则:
RewriteRule ^([a-z]+)/$ index.php?lang=$1 [L,QSA]
我可以像这样访问 URL:
/en/
(预期结果)/en//////////////
(我不想配这个)RewriteRule
pattern(第一个参数)匹配的 URL 路径已经将多个斜杠减少为单斜杠。因此,当您请求 /en//////////////
时,您仍然在与 /en/
进行匹配,因此 pattern 是成功的。
要专门匹配
/en/
而不是 /en//////////////
,您可以尝试在 condition中匹配
REQUEST_URI
。例如:
RewriteCond %{REQUEST_URI} ^/[a-z]+/$
RewriteRule ^([a-z]+)/$ index.php?lang=$1 [L,QSA]
或者,匹配
THE_REQUEST
(HTTP 请求头的第一行),例如:
RewriteCond %{THE_REQUEST} \s/[a-z]+/(\?|\s)
RewriteRule ^([a-z]+)/$ index.php?lang=$1 [L,QSA]
不过,您可以将以(或包含)多个斜杠结尾的 URL 重定向(正确)到单个斜杠(规范)URL。这将是一个单独的规则之前您现有的规则:
# Canonical redirect - reduce multiple slashes
RewriteCond %{THE_REQUEST} \s[^?]*//
RewriteRule (.*) /$1 [R=301,L]
这减少了 UR URL 路径部分中任意位置的多个斜杠,发出 301(永久)重定向到包含单斜杠的规范 URL。