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
相关产品推荐
相关产品推荐

