必须放在location /块内且在location ~ .php$之前,因为Nginx按顺序匹配,location /是兜底规则,需先判断请求是否为真实文件/目录,再将非静态URL交由index.php处理;若放错位置则伪静态失效。

ThinkPHP 8 的 Nginx 伪静态规则必须放在 server 块内的 location / { } 段中,且要位于 PHP 处理块(location ~ \.php$)之前。
为什么必须放在这里
因为 Nginx 匹配 location 是按顺序和优先级进行的:
-
location /是最外层兜底匹配,负责拦截所有请求并判断是否为真实文件/目录; - 只有它先确认“该请求不是静态资源”,才会把非文件类 URL(如
/user/list)交由 index.php 处理; - 如果伪静态规则写在
location ~ \.php$里面,那它只对 .php 请求生效——而伪静态地址根本不会带 .php,压根进不去这个块。
典型正确位置示例
在站点配置文件(如 /www/server/panel/vhost/nginx/your-site.conf)的 server { } 内:
server {
listen 80;
server_name example.com;
root /www/wwwroot/myapp/public; # 注意:必须指向 public 目录
<pre class="brush:php;toolbar:false;">index index.php index.html;
# ✅ 伪静态规则放这里:location / 块内,且在 PHP 块之前
location / {
try_files $uri $uri/ /index.php?$query_string;
}
# ❌ 不要放这里(无效)
# location ~ \.php$ {
# try_files $uri =404; ← 这里加没用
# ...
# }
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param QUERY_STRING $query_string;
include fastcgi.conf;
}}
立即学习“PHP免费学习笔记(深入)”;
特别注意两个易错点
-
不能嵌套在其他 location 块里,比如不要写成
location /admin/ { location / { ... } }; -
不要和 if + rewrite 混用:TP8 推荐纯
try_files,若用if (!-e ...),也必须严格放在location /内部,且不能出现在location ~ \.php$或location = /index.php中。



















