You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Apache重写规则去除URL文件扩展名不生效访问返回404问题求助

故障根因分析
  • 重写规则写在全局httpd.conf中,默认不会自动继承到<VirtualHost>配置块内,你访问的HTTPS站点走443端口的虚拟主机,全局的重写规则完全没有生效
  • 全局上下文下的%{REQUEST_FILENAME}变量并非站点内文件的完整磁盘路径,-f判断无法匹配到真实存在的.html/.php文件,规则不会触发
  • 若虚拟主机配置的DocumentRoot路径不属于/var/www目录范围,对应的目录没有开放重写所需的权限配置,规则即使迁移过去也无法生效
修复步骤
  1. 将重写规则移入对应的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>
  1. 确认站点根目录的权限配置,如果你的DocumentRoot不是/var/www,需要额外新增对应目录的配置:
<Directory "你的站点根目录路径">
    AllowOverride All
    Options FollowSymLinks
    Require all granted
</Directory>
  1. 保存配置后重启Apache服务生效,执行命令:systemctl restart httpd
可选排查手段

如果调整后仍然返回404,可以临时修改虚拟主机的日志级别为LogLevel rewrite:trace3,重启后查看对应站点的错误日志,即可看到每一步重写规则的匹配过程,快速定位不生效的原因。

内容的提问来源于stack exchange,提问作者stripies

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.17 10:06:04