我想将//
路径中带有多个连续斜杠(例如 )的 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 路径中的多个斜杠,并确保我们不匹配查询字符串中的多个斜杠(如果有) - 否则会导致重定向循环。
参考: