【问题标题】:htaccess: Can match one slash, but not double slasheshtaccess:可以匹配一个斜杠,但不能匹配双斜杠
【发布时间】:2021-03-14 11:11:07
【问题描述】:

我无法编写匹配双斜杠的规则。

在我的 .htacess 文件中:

#RULE 1:  
RewriteCond %{REQUEST_URI} ^.*hi1.*$ 
RewriteRule ^.*$ https://www.google.com/ [R=301,L] 

#RULE 2: 
RewriteCond %{REQUEST_URI} ^.*hi2/.*$ 
RewriteRule ^.*$ https://www.google.com/ [R=301,L] 

#RULE 3: 
RewriteCond %{REQUEST_URI} ^.*hi3//.*$ 
RewriteRule ^.*$ https://www.google.com/ [R=301,L] 

结果:

https://www.example.com/hi1//  
successfully redirects to google  

https://www.example.com/hi2//
successfully redirects to google  

https://www.example.com/hi3//
fails to redirect to google

第三个网址产生以下内容:
抱歉,此页面不存在。
请检查网址或返回页面。
404 错误。找不到页面。

编辑#1:

有趣的是:

#RULE 4: 
RewriteCond %{REQUEST_URI} ^.*hi4/.*/.*$ 
RewriteRule ^.*$ https://www.google.com/ [R=301,L] 

结果:

https://www.example.com/hi4/abc/  
successfully redirects to google 

https://www.example.com/hi4//
fails to redirect to google

编辑#2:

我原来的帖子似乎引起了混乱。我会尽量清楚一点:我需要一个规则来匹配以双斜杠结尾的 url,并且不匹配不以双斜杠结尾的 url。目前,我的 .htaccess 文件仅包含以下内容:

RewriteEngine on

RewriteRule yoyo https://www.cnn.com/ [R=301,L]  

RewriteCond %{THE_REQUEST} //$ 
RewriteRule ^.*$ https://www.google.com/ [R=301,L]  

结果:

https://www.example.com/about-us//
fails to redirect to google, and yields 404 error

(第一条规则(悠悠球)只是为了确保没有缓存。)

编辑#3:

我看到混乱仍在继续。所以,我的 .htaccess 文件只包含:

RewriteEngine on
RewriteCond %{THE_REQUEST} //$ 
RewriteRule ^.*$ https://www.google.com/ [R=301,L]  

结果:

https://www.example.com/about-us//
fails to redirect to google, and yields 404 error

这一次,我想我们可以排除缓存,因为我在我的一个网站上使用了 .htaccss,之前没有 .htaccess 文件。

简单地说,我匹配以双斜杠结尾的网址的努力失败了。

【问题讨论】:

  • 这个条件应该有效RewriteCond %{THE_REQUEST} ^.*hi3//.*$
  • oguzhancerit:非常感谢。那些对我不起作用。阿米特:非常感谢。听起来你是在告诉我,我的第三条规则实际上应该起作用。我不明白为什么不是。
  • @Oyvey 尝试清除浏览器缓存并将REQUEST_URI 更改为THE_REQUEST
  • 如上所述,规则#3 和#4 应该按预期工作,并针对所述情况触发重定向。您的.htaccess 文件中还有其他指令吗?上面已经提到了缓存,但是您应该使用 302(临时)重定向来测试它以避免缓存问题。 301 默认情况下会被浏览器持久缓存,因此可能会导致测试出现问题。

标签: apache .htaccess redirect mod-rewrite url-rewriting


【解决方案1】:

当您可以使用正则表达式模式捕获类似类型的 URI 时,您不需要编写 3 条规则,这样我们就不需要编写多个模式,这也需要注意最后出现的多次 /。请您尝试以下操作,请确保在将这些规则放入您的 htaccess 文件后清除浏览器缓存。

RewriteEngine ON
RewriteCond %{REQUEST_URI} ^/hi[0-9]+/{2,}?$ [NC] 
RewriteRule ^(.*)$ https://www.google.com/ [R=301,L] 

【讨论】:

  • 1.非常感谢你的回复。我知道我不需要 3 条规则。他们要查明什么有效,什么无效,并且我能够匹配一个斜线,但不能匹配两个。 2. 您的解决方案重定向 example.com/hi3// 以及 example.com/hi3/ - 我需要一个解决方案,该解决方案将 url 与双斜杠匹配,并且仅将 url 与双斜杠匹配。
  • @oyvey,对于双斜杠或更多斜杠,我检查它对我来说效果很好,对于重定向,我认为你想重定向所有 h 然后是数字 URL?这里不是这样吗,请确认一次。
  • "for double or more slashes" - 但模式/+匹配1个或多个斜线。
  • @MrWhite,谢谢先生,错过了那部分,在这里修复了正则表达式,我希望现在应该很好。
  • @oyvey,我的规则 {2,}?$ 中的模式匹配 2 次或多次出现的 /。如果仅匹配 2 个 / 尝试更改 {2,}?$ --> //?$ 并告诉我这是否对您有帮助?
【解决方案2】:

编辑: 好的,现在我明白了。只匹配以两个斜杠结尾的路径。

我更新了答案。 THE_REQUEST 中的请求 URI 不是在末尾,而是后跟一个空格,之后还有更多,所以匹配 //\s 应该适合你

AmitVerma 在他的评论中提到了正确的答案,但它正在被其他 cmets 雪上加霜。对于像我这样不知道THE_REQUEST 参数的所有其他人(谢谢阿米特),这里有一个更完整的答案。

原始规则的问题在于 REQUEST_URI 参数的使用。该参数的值可能已经被网络服务器或其他模块清除。双斜杠将被删除。

THE_REQUEST 参数包含原始未修改的请求。因此,以下将按要求工作:

RewriteCond %{THE_REQUEST} //\s.*$
RewriteRule ^.*$ https://www.google.com/ [R=301,L] 

【讨论】:

  • 尽管(令人困惑)OP声明他们已经尝试使用THE_REQUEST解决“同样的问题”。但是,在问题的有限范围内,REQUEST_URI 也应该可以工作。除了在config/.htaccess 文件可能在内部重写了 URL,这可能会更改 REQUEST_URI 服务器变量。但是,正如您所建议的,使用 THE_REQUEST 应该可以解决这个问题。
  • 感谢您的帖子,Thakki。我尝试了 Amit 的建议,但没有帮助。它产生了与我的规则 3 相同的结果:没有重定向,而是在我的 OP 中出现 404 错误。
  • 太糟糕了。我在 apache 2.4.18 上使用 REQUEST_URI 和 THE_REQUEST 测试了这个规则/条件组合,我实际上注意到一个按承诺工作而另一个没有按承诺工作的差异。只是为了确保刚才再次对其进行了测试。我希望你能找出你的具体情况出了什么问题。
【解决方案3】:

关于您更新的问题:

...我需要一个匹配以双斜杠结尾的 url 的规则

RewriteCond %{THE_REQUEST} //$ 
RewriteRule ^.*$ https://www.google.com/ [R=301,L]

旁白: 你之前的规则匹配了一个包含双斜线的 URL,在 URL 路径的任何地方(它自然也会在末尾捕获一个双斜线)。

但是,以上内容不会匹配以双斜杠结束的 URL。事实上,它永远不会匹配任何内容,因为THE_REQUEST 不仅包含 URL。 THE_REQUEST 服务器变量包含 HTTP 请求标头的第一行。例如,当您请求https://example.com/about-us// 时,THE_REQUEST 将包含以下形式的字符串:

GET /about-us// HTTP/1.1

因此,您可以从上面看到像//$ 这样的正则表达式永远不会匹配。您将需要使用以下形式的条件:

RewriteCond %{THE_REQUEST} //\s

匹配两个斜线后跟一个空格。这只能出现在 URL 的末尾。 (虽然它也可能出现在查询字符串的末尾,但当我们遇到它时,它会跨越那座桥。)

但是,由于其他建议(例如^.*hi3//.*$)似乎没有奏效,所以这也不会奏效。

您需要在测试前清除浏览器缓存,并请使用 302(临时)重定向进行测试,否则,您很容易绕着圈子追逐缓存问题。您还应该使用“网络”选项卡上打开的浏览器“检查器”进行测试,并检查“禁用缓存”选项。例如,在 Chrome 中:

(更新)调试...

这似乎不是关于正则表达式的问题,因为早期的答案/cmets(以及问题本身中的代码 sn-ps)应该已经产生了预期的结果。所以这里似乎正在发生“其他事情”。

要调试并查看THE_REQUEST 的值,您可以执行以下操作(在.htaccess 文件的最顶部):

RewriteCond %{QUERY_STRING} !^the-request=
RewriteRule ^ /?the-request=%{THE_REQUEST} [R,L]

然后请求/about-us//。然后您应该被重定向到表单的 URL:

/?the-request=GET%20/about-us//%20HTTP/1.1

%20 自然是 URL 编码的空格。)

请准确报告您所看到的内容。

【讨论】:

  • 感谢您分享此内容,我正在尝试RewriteCond %{THE_REQUEST} \shi[0-9]+/{2,}+\s [NC] ,但它也选择了单个/(尽管OP 只说2 个或更多/),谢谢分享。
  • @RavinderSingh13 谢谢。这里的确切要求似乎确实存在混淆,但这种混淆只会变得更加复杂,因为 OP 似乎看到了与指令“应该”做的不同的响应——这仍然是一个谜。 (在 99% 的情况下,这要么是与现有指令冲突,要么是缓存问题。但在最新的问题更新中,他们表示“文件包含仅以下内容”并且他们坚持浏览器缓存是否已清除。(?))
【解决方案4】:

以下是最终匹配双斜杠的方法(没有其他方法对我有用):

RewriteEngine on
RewriteCond %{THE_REQUEST} //
RewriteRule ^.*$ https://www.google.com/ [R=301,L]

(而且,正如我所写,我小心翼翼地防止缓存,所以缓存从来都不是问题。)

情节扭曲:

即使这个解决方案是唯一适用于我的一个网站的解决方案,也不适用于我在本次讨论的大部分时间里一直在测试的网站。换句话说,在该服务器上匹配双斜线没有一个单一的解决方案!

【讨论】:

  • 尽管这与 URL 中的双斜杠 anywhere 匹配,而不仅仅是在末尾(如您更新的问题中所示)。但是,这与已经提供的示例几乎相同。 @AmitVerma 的初始评论建议 ^.*hi3//.*$(与简单的 hi3// 相同)匹配 URL 中的任何位置的“hi3//”,就像 // 匹配 URL 中的任何位置的“//”一样。您的问题(EDIT#3)的最新更新包含与 EDIT#2 相同的 incorrect 正则表达式,但现有的两个答案(包括我的)已经纠正了这个问题(使用 //\s 而不是//$ - 匹配 URL end 处的双斜杠)。
  • 这也与an answer on the linked question相同,你说“对我不起作用。”?
猜你喜欢
  • 1970-01-01
  • 2013-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多