繁体   English   中英

htaccess 中重写规则 apache 中 ^ 与 ^.*$ 之间的区别

[英]difference between ^ vs ^.*$ in Rewrite rule apache in htaccess

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

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

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

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

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

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

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

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

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

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

  1. ^断言 URL 路径的开始。
  2. . 匹配abca
  3. *量词重复上一个匹配 0 次或更多次(贪婪)。
  4. . 匹配abc中的b
  5. *量词重复上一个匹配 0 次或更多次(贪婪)。
  6. . 匹配abc中的c
  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模式中进行,以避免对每个请求进行文件系统检查,而不仅仅是以斜杠结尾的请求(这就是所有需要的)。 例如:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM