如何在 htaccess 中只接受 1 个正斜杠?

问题描述 投票:0回答:1

我有一个像这样的正则表达式重写规则:

RewriteRule ^([a-z]+)/$           index.php?lang=$1 [L,QSA]

我可以像这样访问 URL:

  • /en/
    (预期结果)
  • /en//////////////
    (我不想配这个)
regex .htaccess mod-rewrite
1个回答
0
投票

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。

© www.soinside.com 2019 - 2024. All rights reserved.