Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Apache-使用.htaccess重写尾部扩展_Php_Apache_.htaccess_Mod Rewrite_Url Rewriting - Fatal编程技术网

Php Apache-使用.htaccess重写尾部扩展

Php 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

为了删除尾部扩展名(在本例中是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则无限循环。
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 Once
file.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]