php-Apache-使用.htaccess重写尾随扩展

为了删除结尾的扩展名(在本例中为.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.然后,最后在假定不符合这两个规则的第三次最终检查中,第一个规则将再次匹配,从而无限循环整个过程.

上一篇:php-无需URL重写的元刷新


下一篇:php-为404页创建重定向