使用.htaccess的RewriteRule出现Not Found错误的原因及解决方法
问题:使用.htaccess重写规则后,访问.html页面提示“Not Found”
问题描述
我尝试通过.htaccess文件配置规则,让HTML文件能运行PHP代码,使用的规则如下:
RewriteEngine on RewriteRule ^(.*)\.html $1\.php
但访问test.html时收到错误:
Not Found
请求的URL /test.html在服务器上未找到。
补充说明:本地主机和虚拟主机均测试过,.htaccess文件与HTML文件都放在文档根目录;首页index.html也返回相同的“Not found”错误。本地路径为D:/Server/vhosts/another,移除.htaccess文件后虚拟主机运行正常,排除主机配置问题。
原因分析
- 你当前的规则逻辑是将所有.html请求重定向到对应的.php文件,但服务器上实际只有.html文件,不存在对应的.php资源,因此返回404错误。
- 规则中
$1\.php的反斜杠是多余的转义,不过这不是导致404的直接原因。
解决方法
你需求的核心是让.html文件解析PHP代码,而非将.html请求转向.php文件,因此需调整配置方式:
方法1:直接让服务器解析.html文件中的PHP代码
在.htaccess中添加以下规则,让Apache把.html/.htm文件当作PHP文件处理:
AddType application/x-httpd-php .html .htm
如果服务器使用PHP-FPM环境,可能需要改用以下配置:
<FilesMatch "\.(html|htm)$"> SetHandler application/x-httpd-php </FilesMatch>
方法2:若需隐藏.php后缀(确保存在对应.php文件)
如果你确实需要通过.html访问.php文件(即服务器上有test.php,想通过test.html访问),可调整规则,先检查目标.php文件是否存在,避免无意义跳转:
RewriteEngine On # 仅当请求的.html文件不存在,且对应的.php文件存在时才重写 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME}\.php -f RewriteRule ^(.*)\.html$ $1.php [L]
内容的提问来源于stack exchange,提问作者stckvrw
相关产品推荐
相关产品推荐

