必须用Nginx反向代理精准转发请求,核心在于:一要验证后端服务可达(如Swoole监听127.0.0.1:9501并curl测试);二为基础代理时proxy_pass末尾加/以截断路径前缀、透传Host/X-Real-IP/X-Forwarded-For/X-Forwarded-Proto四头且proxy_redirect off;三为FastCGI直连时必须启用fastcgi_split_path_info与PATH_INFO支持路由;四为子目录部署需location /sub/配proxy_pass http://backend/并设X-Forwarded-Prefix;五为HTTPS透传须后端框架配置APP_URL并启用TrustProxies。

想让ThinkPHP、Laravel或Swoole启动的PHP服务通过标准域名访问,又不想暴露后端端口或破坏原有路由机制,必须用Nginx反向代理把请求精准转发过去——不是简单加个proxy_pass就能跑通,PATH_INFO丢失、404跳转、HTTPS协议透传失败,全在配置细节里。
确认后端服务已就绪并监听正确地址
先验证你的PHP框架服务是否真正可被Nginx访问:ThinkPHP若走Swoole HTTP Server,需运行php think start并监听127.0.0.1:9501;Laravel用php artisan serve --host=127.0.0.1 --port=8000;Swoole则确保server->start()已执行且无端口冲突。这一步漏检,后面所有配置都白搭。
用curl -v http://127.0.0.1:9501/测试返回状态码是否为200。如果超时或拒绝连接,【先停掉防火墙或放行对应端口,Windows需检查“Windows Defender 防火墙”入站规则】。
基础反向代理配置(适配Swoole/Laravel内置Server)
此方案适用于PHP服务不依赖Nginx直接解析PHP文件,而是作为独立HTTP服务运行的场景。
立即学习“PHP免费学习笔记(深入)”;
打开Nginx站点配置文件(如/www/server/panel/vhost/nginx/thinkphp.conf或/etc/nginx/conf.d/myapp.conf),在server块内添加:
第一步:定义location匹配根路径及子路径
在server块中插入:location / { proxy_pass http://127.0.0.1:9501/;
第二步:透传关键请求头
紧接上行,添加四行header设置: proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme;
第三步:关闭重定向改写
加一行防止Nginx篡改后端返回的Location头: proxy_redirect off;
注意:proxy_pass末尾的/不能省——没有它,/api/user会被原样发给后端,而非截去前缀只传/user;有它,才能与ThinkPHP/Laravel路由对齐。
FastCGI直连PHP-FPM(适配传统Apache/Nginx部署模式)
如果你的项目仍用public/index.php入口,且PHP由本地PHP-FPM处理,就必须启用PATH_INFO支持,否则/user/list这类路由会全部404。
方法一:Nginx直连PHP-FPM(推荐用于ThinkPHP 6/8)
① 设置root指向public目录绝对路径:root /var/www/myapp/public;
② 在location ~ \.php$块中,必须包含:fastcgi_split_path_info ^(.+?\.php)(/.*)$;fastcgi_param PATH_INFO $fastcgi_path_info;fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
方法二:复用宝塔面板快捷配置
进入宝塔「网站」→「设置」→「PHP版本」选对版本 →「配置文件」页签,找到location ~ [^/]\.php(/|$)区块,在其内部手动补上fastcgi_split_path_info和PATH_INFO两行——宝塔默认不启用PATH_INFO,不加这两行,路由永远走不通。
子目录部署与HTTPS透传专项处理
当你的应用部署在https://example.com/myapp/这种子路径下,或后端强制校验X-Forwarded-Proto时,常规配置会失效。
子目录代理关键点:
把proxy_pass写成http://127.0.0.1:9501/myapp/是错的;正确写法是:location /myapp/ { proxy_pass http://127.0.0.1:9501/; proxy_set_header Host $host; proxy_set_header X-Forwarded-Prefix /myapp;}
注意proxy_pass末尾带/,且location路径以/结尾——这是唯一能剥离前缀的方式。
HTTPS透传:
后端框架(如Laravel)若调用url()生成链接,必须识别当前是HTTPS协议,否则吐出http://链接。仅靠X-Forwarded-Proto还不够,ThinkPHP需在.env中设APP_URL=https://example.com,Laravel需设APP_URL=https://example.com并确保TrustProxies中间件启用。



















