【发布时间】:2018-03-09 15:01:48
【问题描述】:
要删除尾随扩展名(在这种情况下为.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:对于像
test.com这样的情况,这些规则可能效率低下甚至不够用,但这不是问题所在。我只是想了解重写是如何工作的 BTS。
【问题讨论】:
-
您的第一条规则有效,因为您使用的是
%{THE_REQUEST}变量。您的第二条规则RewriteRule ^(.*?)\.php$ $1 [NC,L,R= 301]无条件地将file.php重定向到/file,所以这个循环。 -
您可以在第二条规则中使用
END标志来避免循环错误RewriteRule !\.php$ % 1.php [END]。 -
@starkeen ...如果这是在
.htaccess文件中(如标签所暗示的那样),那么[END]和[L]基本上不是同义词吗? -
@starkeen 一旦
file.php成为文件,重写规则不应该不满足条件而跳过它吗? -
@AnuragDaolagajao:
mod_rewrite规则循环运行,直到一个或多个规则匹配条件或模式。L标志仅在循环中作为continue工作,但END(适用于 Apache 2.4+)作为break工作并停止循环。使用%{THE_REQUEST}不会导致循环,因为%{THE_REQUEST}不会随着其他规则的应用而改变,而REQUEST_URI在每次规则执行后都会更新。
标签: php apache .htaccess mod-rewrite url-rewriting