如何配置mod_rewrite规则避免影响子文件夹部署的子域名
故障原因
Apache默认会递归向上继承所有父级目录的.htaccess配置。你在主域名根目录配置的前端SPA路由重写规则,会自动生效到所有子目录,其中就包含作为后端子域名文档根目录的子文件夹。原有规则会将子域名下所有匹配不到实体文件、目录的请求,全部重写到主域名根目录的/index.html,和子域名后端的路由逻辑冲突,跨路径重写的异常就会触发500错误。
解决方案
三种方案任选其一即可:
- 方案1:修改主域名根目录的
.htaccess,直接排除后端对应的子目录,让前端路由重写规则不作用于后端路径。修改后的重写配置如下,注意把你的后端子目录实际名称替换成真实的目录名(比如后端目录叫api就填api):
<IfModule mod_negotiation.c> Options -MultiViews </IfModule> <IfModule mod_rewrite.c> RewriteEngine On RewriteBase / # 排除后端子目录,终止后续重写规则对该目录的匹配 RewriteRule ^你的后端子目录实际名称/ - [L] RewriteRule ^index\.html$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.html [L] </IfModule>
- 方案2:在后端子域名对应的子目录里新建独立的
.htaccess文件,关闭父级重写规则的继承,再按后端框架要求配置对应规则即可。如果后端不需要重写规则,直接写入下面的配置就能阻断父级规则的影响:
<IfModule mod_rewrite.c> RewriteEngine On RewriteOptions InheritDownBefore </IfModule>
如果后端是PHP、Python等需要路径重写的服务,在上述配置下方补充对应框架要求的重写规则即可。
- 方案3:调整站点目录结构,将子域名的文档根目录移出主域名的文档根目录,设置为平级的独立目录,同时在主机面板/虚拟主机配置中给两个站点分别独立配置规则,从结构上彻底避免
.htaccess规则继承导致的冲突。这是生产环境最推荐的部署方式,后续前后端配置更新不会互相干扰。
内容的提问来源于stack exchange,提问作者Burlington1308
相关产品推荐
相关产品推荐

