代码之家  ›  专栏  ›  技术社区  ›  user_unknown

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

  •  1
  • user_unknown  · 技术社区  · 2 年前

    我有一个regex重写规则,如下所示:

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

    我可以这样访问URL:

    • /en/ (预期结果)
    • /en////////////// (我不想匹配这个)
    1 回复  |  直到 2 年前
        1
  •  3
  •   MrWhite    2 年前

    的URL路径 RewriteRule 图案 (第一个参数)与的比赛已经将多个斜线减少为一个斜线。所以当你提出要求时 /en////////////// ,您也在匹配 /en/ ,所以 图案 是成功的。

    具体匹配 /en/ 只是而不是 /en////////////// 你可以尝试与匹配 REQUEST_URI 前面的服务器变量 条件 。例如:

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

    在这里 条件 简单地用作第二级验证,因为 请求URI 服务器变量没有减少多个斜杠。

    或者,与匹配 THE_REQUEST (HTTP请求头的第一行),例如:

    RewriteCond %{THE_REQUEST} \s/[a-z]+/(\?|\s)
    RewriteRule ^([a-z]+)/$ index.php?lang=$1 [L,QSA]
    

    请注意 请求(_R) 还将包含查询字符串(和请求方法),因此使用了稍微详细一点的regex。如。 GET /en/ HTTP/1.1

    不过,您可以将以多个斜杠结尾(或包含多个斜杠)的URL重定向(更正)为单斜杠(规范)URL。这将是一条单独的规则 之前 您的现有规则:

    # Canonical redirect - reduce multiple slashes
    RewriteCond %{THE_REQUEST} \s[^?]*//
    RewriteRule (.*) /$1 [R=301,L]
    

    这减少了URL的URL路径部分中任意位置的多个斜杠,从而向包含单个斜杠的规范URL发出301(永久)重定向。

    更新: 这个 重写规则 图案 (.*) 捕获带有任意多个斜杠的URL路径,这些斜杠减少为单个斜杠(稍后在中使用 替代 字符串)。前面 条件 使用正则表达式 \s[^?]*// 检查是否仅在请求的URL路径中出现双斜杠,即在任何之前 ? (否则将表示查询字符串的开始)。我们需要避免匹配查询字符串中可能出现的任何双斜杠。