伪静态访问失败本质是请求未进入php处理或path_info错误;nginx 1.26.2+php 8.4.1下问题集中于location匹配、script_filename构造、cgi.fix_pathinfo配置三处,需检查try_files规则、fastcgi_param拼接及php.ini中cgi.fix_pathinfo=1是否启用。

伪静态访问失败,本质是请求没走到 PHP 处理环节,或 PHP 拿到的路径信息不对。Nginx 1.26.2 + PHP 8.4.1 组合下,问题通常出在 location 匹配逻辑、SCRIPT_FILENAME 构造、PHP 配置开关三处,不是证书或权限问题。
检查 location ~ \.php$ 是否真正生效
Nginx 只有匹配到 .php 后缀的请求,才会触发 fastcgi_pass 转发。但很多伪静态规则(如 /article/123)根本不会带 .php,所以必须靠 rewrite 或 try_files 把它“转”成 PHP 能处理的形式。
- 确认你用了 try_files $uri $uri/ /index.php?$query_string; 这类兜底规则,且它写在 server 块里、不在 location / { } 内部嵌套
- 如果用 rewrite,确保 flag 是 last(内部重定向)而不是 redirect(外部跳转),否则浏览器地址栏会变,且 PHP 接收不到原始 PATH_INFO
- 临时加一行 log_format debug '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" "$request_uri" "$document_uri" "$fastcgi_script_name"'; 并在 access_log 中启用,看日志里 $request_uri 和 $document_uri 是否一致
验证 SCRIPT_FILENAME 是否拼对
PHP 脚本路径拼错,会导致 404 或 No input file specified 错误。Nginx 不会自动补全路径,全靠你手写。
- fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 是标准写法,但前提是 $document_root 结尾无斜杠、$fastcgi_script_name 开头无斜杠;Windows 下路径分隔符必须用正斜杠 /,不能用反斜杠 \
- 若网站根目录是 C:/www,而请求是 /article/123,经 try_files 跳转后 $fastcgi_script_name 应为 /index.php,那么最终 SCRIPT_FILENAME 就是 C:/www/index.php —— 必须真实存在
- 可在 index.php 开头加 var_dump($_SERVER['SCRIPT_FILENAME']); 输出实际值,和文件系统路径逐字比对
确认 PHP 的 cgi.fix_pathinfo 必须为 1
这个参数控制 PHP 如何解析 PATH_INFO。伪静态依赖它来分离脚本名和附加路径,比如把 /index.php/article/123 拆成 $_SERVER['SCRIPT_FILENAME'] = index.php,$_SERVER['PATH_INFO'] = /article/123。
- Windows 环境下 php.ini 中必须设 cgi.fix_pathinfo = 1;设为 0 会导致 PATH_INFO 为空,所有伪静态路由失效
- Linux + PHP-FPM 场景下,该参数在 php-fpm.conf 或 pool 配置中也可覆盖,需检查 fpm 的 php_admin_value[cgi.fix_pathinfo] 是否被强制设为 0
- 改完记得重启 PHP 进程:Windows 上是重启 php-cgi.exe,Linux 上是 systemctl reload php8.4-fpm
排除 rewrite 规则自身冲突
多条 rewrite 共存时,顺序和条件容易互相干扰,尤其当有 break、last、redirect 混用时。
- 把所有 rewrite 放在 server 块最上方,避免被 location 块提前截断
- 用 nginx -t 测试配置语法,再用 nginx -T 输出完整展开后的配置,确认 rewrite 后的最终 URI 是否符合预期
- 临时注释掉其他 rewrite,只留一条最简规则(如 rewrite ^/test$ /index.php?r=test last;),验证基础能力是否正常
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











