PHP伪静态404主因是Nginx未将请求转发至index.php,需检查location /块是否缺失try_files、phpEnv配置是否覆盖伪静态路径、运行目录与document_root是否匹配,并手动执行nginx -s reload。

phpEnv 伪静态失效时,404 不是 PHP 没跑起来,而是 Nginx 根本没把请求转发给 index.php —— 大多数情况是 location / 块里缺 try_files,或规则被其他 location 提前截断。
检查 phpEnv 的 Nginx 配置是否真写了 try_files
phpEnv 默认生成的站点配置常沿用老旧模板,location / 块里只有 root 和 index,没有 try_files。这意味着 /article/123 这类路径不会 fallback 到 index.php,直接 404。
- 打开 phpEnv 对应站点的 Nginx 配置文件(通常在
/phpenv/vhost/你的域名.conf) - 找到
location / {块,确认里面是否包含类似try_files $uri $uri/ /index.php?$args;的语句 - 如果没有,手动补上;注意不要放在
location ~ \.php$里面,必须在location /下 - 若已有
if (!-e $request_filename)这类判断,建议删掉——Nginx 官方已标记为过时,PHP 8.3+ 更易触发重写循环
确认 phpEnv 的 PHP 处理块是否覆盖了伪静态路径
phpEnv 会自动生成一个 location ~ \.php$ 块来转发 PHP 请求,但如果它写在 location / 外面、且用了 ^~ 或 = 修饰符,就可能优先匹配 /index.php 而跳过伪静态路由逻辑。
- 检查该
location ~ \.php$是否在server块顶层,而非嵌套在location /内 - 确保它没加
^~(如location ^~ /.php),这种写法会强制终止匹配,导致 /article/123 连进 PHP 处理器的机会都没有 - fastcgi_param 中必须有
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;,否则即使转进去了,PHP 也找不到脚本
验证伪静态规则是否被 phpEnv 的全局配置屏蔽
phpEnv 的主配置(/phpenv/nginx/conf/nginx.conf)里如果存在 location / 或 location ~ \.html$ 等泛匹配块,且没加 break 或 last,就会干扰子配置里的 rewrite 行为。
立即学习“PHP免费学习笔记(深入)”;
- 执行
nginx -t,看是否报 “conflicting parameter” 或 “duplicate location” - 临时在你的站点配置中
location /末尾加一行return 444;,访问任意路径,如果返回空连接(不是 404),说明该 location 确实生效了 - 若仍 404,大概率是请求根本没进这个 server 块——检查
server_name是否和你访问的域名完全一致(含 www)、listen端口是否正确(比如监听 8080 却用 http://localhost 访问)
运行目录与 document_root 错位导致路径匹配失败
phpEnv 允许为每个站点单独设“运行目录”,比如填了 /public,但伪静态规则仍按网站根目录写,就会出现后台能进、前台全 404,或 CSS/JS 404 连带发生。
- 进 phpEnv 管理界面,确认该站点的“运行目录”设置:ThinkPHP 6 通常填
/public,Laravel 必须填/public,老版本 ThinkPHP 可能是/ - 如果运行目录是
/public,那所有 rewrite 目标路径(如/index.php)实际要写成/public/index.php,或者更稳妥地,在location /里用alias替代root - 用
curl -I http://你的域名/index.php和curl -I http://你的域名/article/123对比响应头中的X-Powered-By是否都出现,可快速判断是否进了同一套 PHP 流程
最常被忽略的是:phpEnv 修改配置后不自动重载 Nginx,nginx -s reload 必须手动执行,且得确认它 reload 的是 phpEnv 自己管理的 nginx 实例,不是系统全局那个。



















