Apache RedirectMatch 与双斜杠不匹配

Apache RedirectMatch 与双斜杠不匹配

我想将//路径中带有多个连续斜杠(例如 )的 URL 重定向为仅带有一个连续斜杠,例如 https://example.com/a//b/c/https://example.com/a/b/c/

我的.htaccess文件包含以下声明。

RedirectMatch 301 ^(.*)/{2,}(.*)$ $1/$2

这不起作用。但是,以下变体可以:

  • 只匹配一个/
  • 匹配其他字符,例如^(.*)q{2,}(.*)$

我的 出了什么问题RedirectMatch

答案1

(mod_alias) 指令匹配的 URL 路径RedirectMatch可能已经减少了多个斜杠(这是将请求映射到文件系统时的必要步骤)。

要测试多个斜杠,您需要使用 mod_rewrite 并检查THE_REQUEST服务器变量(在前面状况THE_REQUEST是“未处理的”并且包含从客户端发送的请求标头的第一行,例如GET /a//b/c/ HTTP/1.1

例如,尝试以下操作,在 .htaccess文件:

RewriteEngine On

RewriteCond %{THE_REQUEST} \s[^?]*//
RewriteRule (.*) /$1 [R=301,L]

这会(通过外部 301 重定向)删除 URL 的 URL 路径部分中任意位置的多个斜杠。(不过,您应始终先使用 302(临时)重定向进行测试,以避免任何潜在的缓存问题。)

这利用了 URL 路径匹配(并捕获)的事实RewriteRule 图案已经解析了多个斜杠。$1反向引用随后在代换细绳。

正则\s[^?]*//表达式条件模式测试 URL 路径中的多个斜杠,并确保我们不匹配查询字符串中的多个斜杠(如果有) - 否则会导致重定向循环。

参考:

相关内容