最简可靠方案是location / { try_files $uri $uri/ $uri.php?$args; },适用于phpenv默认结构;需同时在php处理块中加try_files $uri =404防源码泄露。

phpEnv 下 Nginx 隐藏 .php 后缀,本质是让 /about 这类请求自动命中 /about.php 文件,而不是报 404。它和 ThinkPHP 隐藏 index.php 是两回事:前者是「按需补后缀」,后者是「强制兜底到入口文件」。直接套用 ThinkPHP 的 try_files $uri $uri/ /index.php?s=$uri 会失效。
nginx 配置里必须用 try_files $uri $uri/ $uri.php?$args
这是最简且可靠的方案,适用于 phpEnv 默认结构(网站根目录即 PHP 文件所在目录)。
-
$uri先找真实文件,比如用户访问/contact,Nginx 就去找contact这个无后缀文件 -
$uri/再找同名目录,比如/blog/→ 查找blog/目录 -
$uri.php?$args最后 fallback 到contact.php,并把原始查询参数(如?id=123)原样传过去 - 注意:
$is_args不要手写,?$args已隐含逻辑:有参数才加?,没参数就只拼.php
配置位置在 server 块内,不是 location ~ \.php$ 里:
location / {
try_files $uri $uri/ $uri.php?$args;
}
别漏掉 PHP 处理块的 try_files 安全兜底
如果只改了 location /,但没动 PHP 处理块,可能出现两种诡异问题:
- 访问
/admin.php正常,但访问/admin却返回空白页(实际是 200 + 空响应) - 某些路径下 PHP 脚本被当作静态文件下载(暴露源码)
根本原因是:Nginx 在匹配 location ~ \.php$ 时,若请求 URI 是 /admin,它根本不会进这个块——所以必须确保所有 PHP 执行都走统一入口或显式拦截。推荐加一层保护:
location ~* \.php$ {
try_files $uri =404;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
这行 try_files $uri =404 意味着:只有真实存在的 .php 文件才允许执行;否则直接 404,不给机会下载源码。
phpEnv 的 nginx.conf 文件位置和重载方式
phpEnv 默认把站点配置放在 C:\phpEnv\nginx\vhosts\ 下,每个站点一个 conf 文件(如 myapp.conf)。不要去改主 nginx.conf,否则升级 phpEnv 可能被覆盖。
- 修改完配置后,用 phpEnv 控制面板点「重载 Nginx」,或手动执行:
C:\phpEnv\nginx\nginx.exe -s reload - 如果提示
nginx: [emerg] unknown directive "try_files",说明你用的是极老版本 Nginx( - Windows 下路径分隔符用正斜杠
/,别用反斜杠\;$uri.php中间不能有空格
真正容易卡住的地方,不是规则写不对,而是改完没重载、重载失败没看日志、或者把配置塞进了错误的 location 块里。phpEnv 的 Nginx 日志默认在 C:\phpEnv\nginx\logs\error.log,出问题第一时间翻它。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











