启用mod_rewrite时如何用.htaccess实现URL伪静态跳转并避免无限循环
解决mod_rewrite的.html与.php互转无限循环问题
你的规则出现无限循环的核心原因是:没有区分用户的外部请求和服务器内部的重写操作。当用户访问.php文件被重定向到.html后,服务器内部又把.html重写为.php,这时候第二条规则会再次触发,把内部重写的.php又重定向回.html,反复循环。
修正后的规则如下,完美实现你的需求:
RewriteEngine On # 仅对用户直接发起的.php请求进行重定向,避免内部重写触发循环 RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /.*\.php\ HTTP/ RewriteRule ^(.*)\.php$ $1.html [R=307,L] # 当请求.html文件时,内部加载对应的.php(需确保.php文件存在) RewriteCond %{SCRIPT_FILENAME} !-d RewriteCond %{DOCUMENT_ROOT}/$1.php -f RewriteRule ^(.*)\.html$ $1.php [L]
规则说明:
- 第一条规则通过
%{THE_REQUEST}判断原始请求:这个变量记录的是用户实际发送的请求行(比如GET /file.php HTTP/1.1),只有用户直接访问.php时才会触发重定向,服务器内部重写产生的.php请求不会触发这条规则,彻底避免循环。 - 第二条规则增加了
%{DOCUMENT_ROOT}/$1.php -f条件:确保要重写的.html对应的.php文件确实存在,避免不存在的页面被错误处理。 [L]标记表示执行完当前规则后停止后续规则处理,进一步防止冲突。
效果验证:
- 访问
example.com/folder/file.php:服务器会307重定向到example.com/folder/file.html,地址栏显示.html后缀 - 访问
example.com/folder/file.html:服务器内部加载folder/file.php返回内容,地址栏保持.html - 禁用mod_rewrite时,直接访问
.php文件即可正常使用,不受影响
内容的提问来源于stack exchange,提问作者Simx72
相关产品推荐
相关产品推荐

