【问题标题】:difference between ^ vs ^.*$ in Rewrite rule apache in htaccesshtaccess 中重写规则 apache 中 ^ 与 ^.*$ 之间的区别
【发布时间】:2021-01-01 18:54:33
【问题描述】:

^^.*$ 在这两个表达式的第三行有什么区别。它们是相同的还是不同的

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} (.+)/$
RewriteRule ^  %1 [L,R=301]

 RewriteCond %{REQUEST_FILENAME} !-d
 RewriteCond %{REQUEST_URI} (.+)/$
 RewriteRule ^.*$  %1 [L,R=301]

【问题讨论】:

  • 两者效果相同,但仅使用^(启动锚点)会更高效
  • 原因是规则对匹配的内容以及在这种情况下如何匹配完全不感兴趣。这就是为什么实际匹配模式无关紧要的原因。这就是为什么一个更简单的模式更有意义的原因在这个特定的例子中......但在其他情况下情况并非如此,通常是如果重写规则重用通过该模式捕获的东西

标签: regex apache .htaccess


【解决方案1】:

这两个示例的最终结果是相同的,但它们在技术上是不同的,^ 在这种情况下更有效。

在这两个规则中,您只需要 RewriteRule 指令就可以成功完成所有操作,并且两个正则表达式都可以实现。

^ - 这个正则表达式只是断言字符串的开始锚点,所以它对一切都是成功的,但什么都不匹配。 ($0 反向引用为空。)

更新:例如,给定一个/abc的请求,那么所涉及的大致步骤是:

  1. ^ 断言 URL 路径的开始。
  2. 正则表达式中不再有符号。正则表达式成功。请求的 URL 路径中没有任何匹配项。 $0 反向引用为空。 完成

^.*$ - 这个正则表达式匹配任何东西,所以它对所有东西都是成功的并且匹配所有东西。因为它实际上匹配一切$0 反向引用存储了匹配的整个 URL 路径。如果您只需要成功,那么效率会降低,因为它会遍历整个 URL 路径。顺便说一句,这与简单的 .* 相同,因为正则表达式默认是 greedy

更新:例如,给定一个/abc的请求,那么所涉及的大致步骤是:

  1. ^ 断言 URL 路径的开始。
  2. . 匹配 a 中的 abc
  3. * 量词重复上一次匹配 0 次或更多次(贪婪)。
  4. . 匹配 b 中的 abc
  5. * 量词重复上一次匹配 0 次或更多次(贪婪)。
  6. . 匹配 c 中的 abc
  7. * 量词重复上一次匹配 0 次或更多次(贪心)。
  8. . 不匹配任何内容(失败),因为我们已到达 URL 路径的末尾。
  9. $ 断言 URL 路径的结尾。
  10. 正则表达式中不再有符号。正则表达式成功。整个 URL 路径已通过遍历 URL 路径进行匹配。 $0 反向引用包含整个 URL 路径。 完成

不过……

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} (.+)/$
RewriteRule ^  %1 [L,R=301]

这实际上可以提高效率,因为不需要第二个RewriteCond 指令。应该在RewriteRule pattern 中进行此检查,以避免对每个请求进行文件系统检查,而不仅仅是以斜杠结尾的请求(这是必需的)。例如:

RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.+)/$ /$1 [L,R=301]

RewriteRulepattern 在任何条件之前首先被处理,所以你应该在这里做尽可能多的处理。请注意在 substitution 字符串上添加了斜杠前缀,$1 反向引用中缺少该前缀。 (斜杠是 %1 反向引用的一部分 - 正如您之前使用的那样 - 因为 REQUEST_URI 服务器变量以斜杠开头。)

【讨论】:

  • 我在每种情况下都添加了一个示例,显示了请求/abc 形式的 URL 时所涉及的大致步骤。
  • 感谢@MrWhite 真的消除了我心中的歧义......:D
  • 不客气。如果这回答了您的问题,那么请通过单击投票箭头下方答案旁边的勾号/复选标记将其标记为“已接受”(以帮助其他读者并从未回答的问题队列中删除该问题)。谢谢,非常感谢。 :)
猜你喜欢
  • 2014-11-21
  • 1970-01-01
  • 2021-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-14
  • 2011-10-22
相关资源
最近更新 更多