[英]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
的请求,那么所涉及的大约步骤是:
^
断言 URL 路径的开始。$0
反向引用为空。 完毕 ^.*$
- 这个正则表达式匹配任何东西,所以它对所有东西都是成功的,并且匹配所有东西。 由于它实际上匹配了所有内容,因此$0
反向引用存储了匹配的整个 URL 路径。 如果您只需要成功,那么效率会降低,因为它会遍历整个 URL 路径。 顺便说一句,这与简单的.*
相同,因为正则表达式默认是贪婪的。
更新:例如,给定/abc
的请求,那么所涉及的大约步骤是:
^
断言 URL 路径的开始。.
匹配abc
中a
。*
量词重复上一个匹配 0 次或更多次(贪婪)。.
匹配abc
中的b
。*
量词重复上一个匹配 0 次或更多次(贪婪)。.
匹配abc
中的c
。*
量词重复上一个匹配 0 次或更多次(贪婪)。.
不匹配任何内容(失败),因为我们已到达 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.