为了删除结尾的扩展名(在本例中为.php),我尝试了以下两组规则
RewriteCond %{THE_REQUEST} (\S*?)/(.*?)\.php [NC]
RewriteRule ^ %1/%2 [L,R=301]
RewriteCond %{REQUEST_URI} ^(.*)$
RewriteRule !\.php$%1.php [NC,L]
和
RewriteRule ^(.*?)\.php$$1 [NC,L,R=301]
RewriteCond %{REQUEST_URI} ^(.*)$
RewriteRule !\.php$%1.php [NC,L]
要将诸如test.com/test.php之类的网址转换为test.com/test,第一个有效,而第二个无限循环. rewrite_log只是令人困惑,所以任何人都可以说出第二组是什么问题吗?
PS: The rules might be inefficient or even not sufficient for a case like
test.com
but that’s not the issue. I just want to understand how the rewrite is working BTS.
解决方法:
如注释中所述,在第一种情况下,不会使用%{THE_REQUEST}进行循环,因为该值是静态的,并且即使在重定向/“循环”之后,服务器接收到该值也不会更改.因此,该规则将删除结尾的.php并重定向.由于重写规则是用%{THE_REQUEST}中的值替换rewritecond中的值,因此在重定向之后,该值将不包含结尾的.php,因此继续进行第二个rewritecond,然后最终在内部进行重定向.在第二次重定向后,两个条件都将不匹配,因此将停止该过程
而在第二种情况下,重写规则将检查uri中的值,这将删除.php并重定向.重定向后,第二条规则将在内部使用php扩展名重定向回uri.然后,最后在假定不符合这两个规则的第三次最终检查中,第一个规则将再次匹配,从而无限循环整个过程.