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

Apache重写规则配置需求:非存在URI指向index.html,存在文件正常返回

Apache重写规则配置需求:非存在URI指向index.html,存在文件正常返回

你遇到的是单页应用(SPA)部署里很常见的路由问题——原来的规则太“一刀切”,不管请求的资源实际存在与否都直接重写到index.html,才导致静态文件也被错误拦截了。只需要给RewriteRule加上两个前置判断条件,就能完美实现你要的效果:

修改后的VirtualHost配置如下:

<VirtualHost *:80>
    DocumentRoot "/var/www/frontend/"
    RewriteEngine On

    # 条件1:请求的不是一个已存在的文件
    RewriteCond %{REQUEST_FILENAME} !-f
    # 条件2:请求的不是一个已存在的目录
    RewriteCond %{REQUEST_FILENAME} !-d
    # 满足上述两个条件时,重写到index.html,[L]表示停止后续规则处理
    RewriteRule . /index.html [L]
</VirtualHost>

我给你拆解下每个配置的作用:

  • RewriteCond %{REQUEST_FILENAME} !-f:!-f代表“不是一个真实存在的普通文件”,如果用户请求的是/js/app.js这类实际存在的文件,这个条件不成立,不会触发重写。
  • RewriteCond %{REQUEST_FILENAME} !-d:!-d代表“不是一个真实存在的目录”,避免/assets/这类实际存在的目录被错误重写。
  • RewriteRule . /index.html [L]:当上面两个条件同时满足(也就是请求的资源既不是文件也不是目录),就把请求重写到index.html;[L]标志告诉Apache处理完这条规则就停止,不用继续匹配其他规则,能提升处理效率。

这样测试下来完全符合你的需求:

  • 访问/contact:不存在对应文件或目录,触发重写返回index.html
  • 访问/:Apache会自动匹配默认的DirectoryIndex(也就是index.html),直接返回
  • 访问/js/app.js或/favicon.ico:文件真实存在,直接返回对应资源,不会被拦截

另外你提到后端服务在8080端口,这个VirtualHost的配置完全不影响后端请求,两者可以正常共存~

备注:内容来源于stack exchange,提问作者MHSarmadi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.21 11:08:04