必须通过nginx透传x-original-uri头并修改public/index.php覆盖$_server['request_uri'],同时确保tp5.1开启url_pathinfo_convert,才能去除url中index.php;需禁用nginx重写指令,仅保留proxy_pass与必要header传递。

TP5.1老项目部署在Nginx反向代理后,URL仍带index.php(如https://site.com/index.php/user/login),导致SEO权重分散、分享链接不专业、移动端跳转异常——必须让所有路由请求经由Nginx透传至后端服务时自动剥离index.php前缀,并确保PATH_INFO或s=参数准确送达ThinkPHP内核。
确认反向代理链路与入口文件位置
打开Nginx站点配置文件(如/etc/nginx/conf.d/thinkphp.conf),检查proxy_pass是否指向真实后端地址(如http://127.0.0.1:8080或http://php-fpm:9000)。【关键前提】后端服务必须已启用url_pathinfo_convert => true(TP5.1 config/app.php中),否则PATH_INFO无法被框架识别。
若后端是Swoole HTTP Server或自建PHP-FPM直连服务,需确认其监听的入口脚本为public/index.php而非项目根目录下的index.php。路径错位会导致No input file specified错误。
配置Nginx透传原始路径并补全s参数
在location /块中添加以下三行:
proxy_set_header X-Original-URI $request_uri;
proxy_set_header X-Path-Info $uri;
proxy_set_header X-Script-Name /index.php;
这三行不是可选装饰——它们让后端服务能从Header中提取原始请求路径,绕过Nginx自身对index.php的硬编码截断。尤其当proxy_pass目标不包含index.php时,X-Original-URI是唯一能还原/user/login这种路径的依据。
后端TP5.1适配X-Original-URI解析
在TP5.1项目的public/index.php顶部(define('APP_PATH', ...)之后、require之前)插入以下代码:
if (isset($_SERVER['HTTP_X_ORIGINAL_URI'])) {<br> $_SERVER['REQUEST_URI'] = $_SERVER['HTTP_X_ORIGINAL_URI'];<br> $_SERVER['PATH_INFO'] = parse_url($_SERVER['HTTP_X_ORIGINAL_URI'], PHP_URL_PATH);<br>}
这段代码强制将反向代理传来的原始URI覆盖PHP默认的REQUEST_URI,避免Nginx重写规则缺失时框架误判路由。注意:不要用$_GET['s']拼接,TP5.1的Url::parseUrl()依赖PATH_INFO或QUERY_STRING中的s=,而此处直接喂给它干净的路径。
禁用Nginx内部重写,专注Header透传
删除配置中所有if (!-e $request_filename) { rewrite ... }和try_files语句。反向代理场景下,这些指令作用于Nginx本地文件系统,对转发到后端的服务无效,反而可能触发404或循环重定向。
只保留最简location /块:
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Original-URI $request_uri;
}
重启Nginx:sudo systemctl reload nginx。此时访问https://site.com/user/login,后端TP5.1将收到完整路径并正确匹配路由,不再显示index.php。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











