我尝试在启用 mod 重写时,htaccess 将所有页面从
.php
重定向到 .html
。但我也希望在后台,服务器在收到 .php
请求时“提供” .html
文件。
例如,我访问我的网站
example.com/folder/file.html
,因此服务器应该渲染/folder/file.php
并发送它。但如果我在浏览器中写入 example.com/folder/file.php
,我希望服务器将我重定向到 example.com/folder/file.html
,然后运行 php 代码。
我希望这样,当启用 mod_rewrite 时,我的网站将具有 .html 扩展名,但当它被禁用时,它将使用 .php 扩展名。
我尝试做的是:
RewriteEngine On
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteRule ^(.*)\.html$ $1.php [L]
RewriteRule ^(.*)\.php$ $1.html [R=307]
但它会引发无限循环。
为了实现所需的行为,您需要确保您的规则不会创建无限循环。您当前的规则正在导致循环,因为这两个规则可以应用于同一请求,从而导致 .php 和 .html 之间的连续重定向。
这是 .htaccess 文件的更新版本,以避免无限循环:
Options +FollowSymLinks
RewriteEngine On
# Prevent internal redirect for existing files and directories
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
# Rewrite .html to .php internally
RewriteRule ^(.*)\.html$ $1.php [L]
# Redirect external requests from .php to .html
RewriteCond %{THE_REQUEST} \.php
RewriteRule ^(.*)\.php$ $1.html [R=307,L]
说明:
第一个
RewriteCond
检查请求的文件或目录是否不作为服务器上的物理文件或目录存在。
第二个
RewriteCond
检查请求的文件是否不作为服务器上的物理文件存在。
第一个
RewriteRule
在内部将请求从.html重写为.php,而不重定向浏览器。 [L]
标志表示如果满足条件,这是要处理的最后一条规则。
第二组条件(
RewriteCond
和RewriteRule
)检查请求是否包含.php。如果是这样,它将浏览器重定向到相应的 .html 文件。 [R=307,L]
标志执行临时 (307) 重定向并停止处理进一步的规则。
有了这些规则,您应该能够实现所需的行为,而不会导致无限循环。