Apache重写规则去除URL文件扩展名不生效访问返回404问题求助
故障根因分析
- 重写规则写在全局httpd.conf中,默认不会自动继承到
<VirtualHost>配置块内,你访问的HTTPS站点走443端口的虚拟主机,全局的重写规则完全没有生效 - 全局上下文下的
%{REQUEST_FILENAME}变量并非站点内文件的完整磁盘路径,-f判断无法匹配到真实存在的.html/.php文件,规则不会触发 - 若虚拟主机配置的
DocumentRoot路径不属于/var/www目录范围,对应的目录没有开放重写所需的权限配置,规则即使迁移过去也无法生效
修复步骤
- 将重写规则移入对应的443虚拟主机配置块内,调整规则的路径判断逻辑,示例配置如下:
<VirtualHost *:443> # 原有配置保持不变 DocumentRoot 你的站点根目录路径 ServerName 你的域名 # 新增以下重写配置 <IfModule mod_rewrite.c> RewriteEngine On # 仅当请求本身不是已存在的文件/目录时才触发重写 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d # 先匹配.html后缀的文件 RewriteCond %{DOCUMENT_ROOT}/$1.html -f RewriteRule ^(.*)$ $1.html [L] # 再匹配.php后缀的文件 RewriteCond %{DOCUMENT_ROOT}/$1.php -f RewriteRule ^(.*)$ $1.php [L] </IfModule> # 原有SSL配置、代理配置保持不变 </VirtualHost>
- 确认站点根目录的权限配置,如果你的
DocumentRoot不是/var/www,需要额外新增对应目录的配置:
<Directory "你的站点根目录路径"> AllowOverride All Options FollowSymLinks Require all granted </Directory>
- 保存配置后重启Apache服务生效,执行命令:
systemctl restart httpd
可选排查手段
如果调整后仍然返回404,可以临时修改虚拟主机的日志级别为LogLevel rewrite:trace3,重启后查看对应站点的错误日志,即可看到每一步重写规则的匹配过程,快速定位不生效的原因。
内容的提问来源于stack exchange,提问作者stripies
相关产品推荐
相关产品推荐

