Apache配置实现/api路由指向backend其余指向frontend子目录
问题修复方案
你原有重写规则存在两个核心语法/逻辑错误:
- 前端转发部分仅写了
RewriteCond条件判断,没有配套的RewriteRule执行转发,规则完全不生效 - 没有处理前后端静态资源的直接访问、以及框架路由的fallback逻辑,即使转发成功也会出现静态资源404、路由失效问题
前置要求
- 确保Apache已经开启
mod_rewrite模块 - 虚拟主机的
DocumentRoot指向你目录结构中的www根目录 - 如果使用
.htaccess方式配置,需要给www目录配置AllowOverride All权限
正确重写规则
将以下规则替换你原有规则即可,规则兼容后端MVC框架、前端SPA单页应用的路由需求:
RewriteEngine On # 跳过已经指向前后端public目录的请求,避免重写死循环 RewriteRule ^frontend/public/ - [L,NC] RewriteRule ^backend/public/ - [L,NC] # 匹配/api前缀请求,转发到后端public目录 RewriteRule ^api(/.*)?$ /backend/public$1 [L,NC] # 后端路由fallback:静态文件/目录不存在时,转发到后端入口文件(适配Laravel/ThinkPHP等后端框架) RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^backend/public(/.*)?$ /backend/public/index.php [L] # 其余所有请求转发到前端public目录 RewriteRule ^(.*)$ /frontend/public/$1 [L] # 前端路由fallback:静态文件/目录不存在时,转发到前端入口(适配Vue/React等SPA框架history模式路由) RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^frontend/public(/.*)?$ /frontend/public/index.html [L]
效果验证
规则生效后符合你的预期:
- 访问
domain.com/foo:自动映射到www/frontend/public目录下的对应资源,不存在则走前端路由 - 访问
domain.com/api/foo:自动映射到www/backend/public目录下的对应资源,不存在则走后端路由 - 前后端的静态资源(js/css/图片/上传文件)会直接返回,不需要额外配置路径前缀
如果你的站点是纯静态站点,没有使用前后端框架路由,可以删除两段fallback相关的规则,仅保留路径转发部分即可。
内容的提问来源于stack exchange,提问作者Dastan
相关产品推荐
相关产品推荐

