关键在于Nginx反向代理实现路径级路由分发:前端静态资源由Nginx直接托管,后端API通过proxy_pass精准代理至本地端口,且proxy_pass末尾斜杠必须存在以剥离前缀,确保前后端完全隔离、安全高效。

在 PHP 项目中实现前后端分离部署,关键不是“创建虚拟目录”,而是用 Nginx 的反向代理能力做路径级路由分发——前端走静态文件服务,后端 API 走本地端口代理。宝塔或标准 Nginx 环境下,这比传统 PHP 虚拟目录更清晰、更安全、也更符合现代部署逻辑。
前端静态资源必须独立托管,不混入 PHP 处理
前端构建产物(如 Vue/React 的 dist 文件夹)应直接由 Nginx 提供服务,不经过 PHP-FPM。这意味着:
- 网站根目录指向
/www/wwwroot/myapp-fe这类纯静态路径,而非含index.php的 PHP 入口 - 禁用该站点的 PHP 处理器,或在「网站设置 → PHP版本」中选择“纯静态”模式(宝塔 v8.0+ 支持)
- 若使用 history 模式路由,需手动添加 fallback 规则:
location / { try_files $uri $uri/ /index.html; }
后端 API 必须限定路径前缀并精准代理
不能把整个域名全代理给后端服务(比如 proxy_pass http://127.0.0.1:8080),否则前端资源请求也会被转发,导致 404 或跨域失败。正确做法是只代理带明确前缀的路径:
- 在 Nginx 配置的
server{}块内添加:location ^~ /api/ { proxy_pass http://127.0.0.1:8080/; } - 注意
proxy_pass末尾的/:它会自动剥离/api/,使后端收到/login而非/api/login - 后端服务必须监听
127.0.0.1:8080(非0.0.0.0),且防火墙/安全组禁止外网访问该端口
子目录部署时,路径与构建配置要严格对齐
如果想把前端放在 example.com/myapp/,后端接口走 example.com/myapp/api/,需三处同步:
立即学习“PHP免费学习笔记(深入)”;
- 前端构建时设置
publicPath: "/myapp/"(Vue CLI)或base: "/myapp/"(Vite),确保 JS/CSS 路径正确 - Nginx 中为 API 单独写 location:
location ^~ /myapp/api/ { proxy_pass http://127.0.0.1:9001/; } - 前端页面本身仍由 Nginx 直接读取磁盘,不触发代理——只有带
/myapp/api/的请求才进后端
PHP 后端若需共存,应隔离运行环境而非共享根目录
当主站是 PHP(如 ThinkPHP、Laravel),又要挂载一个 Node.js 后端 API 时,不要把 Node 服务代码放 PHP 目录里。正确方式是:
- PHP 站点保持原结构,根目录设为
/www/wwwroot/php-site - Node 服务单独运行在
127.0.0.1:3000,通过反向代理暴露为/api/或/v1/ - 避免在 PHP 中用
file_get_contents("http://127.0.0.1:3000/xxx")调用,那属于内部 HTTP 请求,效率低且难调试



















