正确写法是try_files $uri $uri/ /index.php?$args;需配合fastcgi_param request_uri $request_uri等配置,并确保yii中enableprettyurl=true且清缓存。

Yii URL美化后Nginx返回404,try_files怎么写才对
根本原因不是Yii没配好,是Nginx没把非静态资源请求正确转给index.php。默认的try_files $uri $uri/ =404会直接拒掉所有没对应物理文件的URL,而Yii美化后的路由(比如/post/view?id=123 → /post/123)压根不对应真实文件。
location /里try_files必须兜底到index.php
关键就这一行:把所有无法匹配静态文件的请求,全部交给index.php处理。Yii的UrlManager才能接着解析路径。
常见错误写法:try_files $uri $uri/ =404 —— 这会让/user/login这种美化URL直接404。
正确写法(放在location /块内):
try_files $uri $uri/ /index.php?$args;
-
$uri:先查有没有对应的真实文件(如/css/main.css) -
$uri/:再查有没有对应目录(如/uploads/) -
/index.php?$args:都不命中,就转发给index.php,并带上原始查询参数(?r=user/login或美化后的路径)
别漏掉location ~ \.php$的fastcgi_param配置
即使try_files转过去了,如果PHP-FPM没收到正确的脚本路径和路由信息,Yii还是拿不到REQUEST_URI,导致UrlManager解析失败,最终也可能404或跳首页。
必须确保这个location块里有:
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; fastcgi_param REQUEST_URI $request_uri;
- 缺
SCRIPT_FILENAME:PHP报No input file specified. - 缺
REQUEST_URI:Yii看到的是/index.php而不是/post/123,路由完全失效 -
PATH_INFO在某些urlManager模式下也需要,尤其用pathInfo而非get参数时
检查Yii的urlManager是否启用enablePrettyUrl
Nginx配对了,但Yii自己没开美化,照样走?r=xxx老路——这时你改Nginx反而可能让原本能访问的URL变404。
确认config/web.php里有:
'urlManager' => [
'enablePrettyUrl' => true,
'showScriptName' => false,
'rules' => [...],
],
-
enablePrettyUrl必须为true,否则Yii根本不尝试解析美化路径 -
showScriptName设为false,不然生成的URL还会带index.php前缀,跟Nginx配置冲突 - 如果用了
pathInfo模式(默认),Nginx不需要额外重写;如果是get模式,try_files那行末尾要用/index.php?r=$uri&$args,但不推荐
最常被忽略的是:改完Nginx要nginx -t && nginx -s reload,改完Yii配置要清应用缓存(runtime/cache/),否则新规则根本没生效。











