Nginx 运行 PHP 源码需正确配置 location 匹配 PHP 文件并指向 PHP-FPM,配合 try_files 实现 URL 重写,且 fastcgi_param 必须完整设置 SCRIPT_FILENAME、SCRIPT_NAME、REQUEST_URI 等关键参数。

PHP 源码搭配 Nginx 运行,核心不是改 PHP 本身,而是让 Nginx 正确把请求转发给 PHP-FPM,并处理好 URL 重写(尤其是 Laravel、ThinkPHP 等框架的 index.php 入口模式)。关键在 location 块配置和 fastcgi_param 传递。
必须配对的 location + fastcgi_pass
Nginx 不会自动调用 PHP-FPM,得显式声明哪些请求交给它。常见错误是只写 fastcgi_pass 却没限定匹配路径,或用了 proxy_pass(那是转给 Node/Java 的)。
- 确保有类似这样的块,且位于
server内:location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; # 或 unix:/var/run/php/php8.1-fpm.sock include fastcgi.conf; } -
fastcgi_pass地址必须和php-fpm.conf里listen的值一致,不一致会导致502 Bad Gateway - 不要用
location /包住fastcgi_pass,否则所有请求(包括图片、CSS)都发给 PHP-FPM,直接 500
重写规则:隐藏 index.php 是最常踩的坑
多数现代 PHP 框架依赖 URL 重写,把 /user/123 这类地址映射到 index.php?/user/123。Nginx 默认不处理,得手动加 try_files。
- Laravel/ThinkPHP 等要求入口为
index.php,推荐写法:location / { try_files $uri $uri/ /index.php?$query_string; } - 别用
rewrite ^/(.*)$ /index.php/$1 last;—— 容易循环重定向,且$1无法被$_SERVER['PATH_INFO']正确捕获 - 如果框架用的是
PATH_INFO方式(如旧版 ThinkPHP),需额外加:fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param 里这几个不能少
fastcgi.conf 文件通常已包含基础参数,但容易被覆盖或遗漏。以下三项直接影响 $_SERVER 变量是否可用:
立即学习“PHP免费学习笔记(深入)”;
-
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;—— 缺失会导致File not found,因为 PHP-FPM 找不到真实文件路径 -
fastcgi_param SCRIPT_NAME $fastcgi_script_name;—— 影响$_SERVER['SCRIPT_NAME'],路由生成依赖它 -
fastcgi_param REQUEST_URI $request_uri;—— 关系到重写后原始 URL 的保留,否则$_SERVER['REQUEST_URI']变成重写前的值 - 如果用了 HTTPS,还要加:
fastcgi_param HTTPS on;,否则框架可能误判协议,生成 http 链接
实际调试时,先看 Nginx error log 是否报 connect() failed(端口/sock 错),再看 PHP-FPM log 是否有 Primary script unknown(SCRIPT_FILENAME 构造错),最后检查 phpinfo() 里 $_SERVER 各项是否符合预期。重写和参数是连动的,改一个得验全部。











