Php Apache-使用.htaccess重写尾部扩展
为了删除尾部扩展名(在本例中是aPhp Apache-使用.htaccess重写尾部扩展,php,apache,.htaccess,mod-rewrite,url-rewriting,Php,Apache,.htaccess,Mod Rewrite,Url Rewriting,为了删除尾部扩展名(在本例中是a.php),我尝试了以下两组规则 RewriteCond %{THE_REQUEST} (\S*?)/(.*?)\.php [NC] RewriteRule ^ %1/%2 [L,R=301] RewriteCond %{REQUEST_URI} ^(.*)$ RewriteRule !\.php$ %1.php [NC,L] 及 要将类似test.com/test.php的url转换为test.com/test,第一个url有效,而第二个url则无限循环。re
.php
),我尝试了以下两组规则
RewriteCond %{THE_REQUEST} (\S*?)/(.*?)\.php [NC]
RewriteRule ^ %1/%2 [L,R=301]
RewriteCond %{REQUEST_URI} ^(.*)$
RewriteRule !\.php$ %1.php [NC,L]
及
要将类似test.com/test.php
的url转换为test.com/test
,第一个url有效,而第二个url则无限循环。rewrite\u log
很混乱,所以有人能告诉我第二组的问题是什么吗
PS:对于test.com
这样的情况,规则可能效率低下,甚至不够,但这不是问题所在。我只是想了解一下重写是如何工作的
如注释中所述,在第一种情况下,使用
%{the_REQUEST}
不存在循环,因为该值是静态的,即使在重定向/“循环”后,服务器收到该值后也不会更改。因此,规则将删除尾随的.php
并重定向。由于重写规则正在替换rewritecond
中%{the_REQUEST}
中的值,重定向后,该值将不包含尾随的.php
,因此继续执行第二个rewritecond
,然后最终在内部重定向。在第二次重定向后,两个条件都将不匹配,从而停止进程
而在第二种情况下,重写规则检查
uri
中的值,这将删除.php
并重定向。重定向之后,第二条规则将在内部重定向回带有php扩展名的uri。最后,在假定的第三个最终检查中,假设两个规则都不匹配,第一个规则将再次匹配,从而无限循环整个过程。第一个规则有效,因为您使用的是%{the_REQUEST}
变量。第二个规则RewriteRule^(.*)\.php$$1[NC,L,R=301]
正在无条件地将file.php
重定向到/file
,因此会循环。您可以在第二条规则中使用END
标志,以避免循环错误重写规则!\。php$%1.php[END]
@starkeen。。。如果这是在一个.htaccess
文件中(如标签所示),那么[END]
和[L]
基本上不是同义的吗?@starkeen Oncefile.php
变成文件,rewriterule不应该满足条件并因此跳过它吗?@AnuragDaolagajao:mod_rewrite
规则在循环中运行,直到一个或多个规则与条件或模式匹配L
标志仅在循环中充当continue
,但END
(Apache 2.4+提供)充当break
并停止循环。使用%{THE_REQUEST}
不会导致循环,因为%{THE_REQUEST}
不会随着其他规则的应用而更改,而请求URI
会在每次规则执行后更新。
RewriteRule ^(.*?)\.php$ $1 [NC,L,R=301]
RewriteCond %{REQUEST_URI} ^(.*)$
RewriteRule !\.php$ %1.php [NC,L]