删除 URL 中的前导斜杠 - Apache

删除 URL 中的前导斜杠 - Apache

我一直在尝试删除所有 URL 末尾的斜杠。例如,我希望重定向以下 URL:

  • http://example.com///test->http://example.com/test
  • http://example.com//test->http://example.com/test
  • http://example.com/test->http://example.com/test

我尝试使用以下RedirectMatch规则:
RedirectMatch 301 ^//+(.*)$ http://example.com/$1
然而这根本不起作用。页面没有重定向,并且带有多个斜杠的 URL 出现在服务器日志中。

我也尝试过使用以下RewriteRule规则:
RewriteRule ^//+(.*)$ http://example.com/$1 [R=301,L]
但这也没有任何作用。


奇怪的是,规则
RedirectMatch 301 ^//*(.*)$ http://example.com/$1
确实按预期工作,这意味着它会重定向全部URL,甚至正确的 URL。但是,只要我将表达式更改为,^//+(.*)$它就会停止匹配任何内容。


的输出httpd -v为:

Server version: Apache/2.4.37 (centos)
Server built:   Oct  7 2019 21:42:02

我在 CentOS 8 上运行。


任何帮助都将不胜感激!

答案1

减少多个斜线的最简单方法任何地方在 URL 路径中使用 mod_rewriteRewriteRule 图案匹配的 已被“处理​​”,并且已将多个斜杠简化为单个斜杠。然后我们可以使用另一个条件(并检查THE_REQUEST)来确定初始请求中是否存在多个斜杠。

在任何现有重写/重定向之前,请尝试以下操作:

RewriteEngine On

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

前面的状况RewriteCond指令)检查THE_REQUEST服务器变量(其中包含生的我们可以使用 .net.URL. 属性检查器检查 URL 路径中是否存在 2 个或更多斜杠(即 HTTP 请求的第一行,并且不进行任何修改)。

对于像这样的请求http://example.com///testTHE_REQUEST将包含以下形式的字符串:

GET ///test HTTP/1.1

捕获的反向引用($1)已经减少了多个斜线(如上所述)


更新:

我最初在前面使用了正则表达式//+(虽然//已经足够了)条件模式。但是,这也会匹配查询字符串中的多个斜杠(如果有),而不仅仅是 URL 路径,但后面的规则只会减少 URL 路径中的斜杠,因此如果查询字符串中确实出现多个斜杠,这可能会导致重定向循环。

\s[^?]*//另一方面,正则表达式仅匹配第一个斜杠之前的多个斜杠?。因此仅匹配 URL 路径,而不是查询字符串。

我还修改了RewriteRule“更简单”的指令,RewriteRule (.*) $1以便它在任何情况下都能工作。<VirtualHost>根据问题,之前的规则在容器中直接使用时没有问题。


快速浏览一下您的尝试:

我尝试使用以下RedirectMatch规则:
RedirectMatch 301 ^//+(.*)$ http://example.com/$1
然而这根本不起作用。页面没有重定向,并且带有多个斜杠的 URL 出现在服务器日志中。

这永远不会匹配多个斜杠,因为该指令匹配的 URL 路径RedirectMatch已经被处理以减少多个斜杠。

我也尝试过使用以下RewriteRule规则:
RewriteRule ^//+(.*)$ http://example.com/$1 [R=301,L]
但这也没有任何作用。

原因同上。而我们在上面使用的正是这个“特性”回答减少请求中的多个斜线。

奇怪的是,规则:
RedirectMatch 301 ^//*(.*)$ http://example.com/$1
确实按预期工作,这意味着它会重定向所有 URL,甚至正确的 URL。但是,一旦我将表达式更改为,^//+(.*)$它就会停止匹配任何内容。

因为正则表达式匹配单个斜杠,并且指令匹配的//*URL 路径开头始终有一个斜杠。具体来说,正则表达式匹配单个斜杠后跟RedirectMatch//*0 个或更多斜线(如量词所示*)。但这会导致无限的重定向循环。

而正则表达式//+至少匹配 2 个斜杠。具体来说,一个斜杠后跟1 个或以上斜线(如量词所示+)。因此,出于上述原因,它不会匹配,因此不会发生重定向。

相关内容