yii应用nginx下404主因是location未匹配index.php或php-fpm传递异常;需配置try_files含$args、script_filename用$realpath_root、启用fastcgi_split_path_info并正确设置path_info。

Yii 应用在 Nginx 下返回 404,rewrite 规则没生效
绝大多数情况是 location 块没匹配到 index.php,或者 PHP-FPM 没正确传递请求。Nginx 默认不支持 PATH_INFO,而 Yii(尤其 2.x)依赖它来解析路由。
- 确认
location /块里有try_files $uri $uri/ /index.php?$args;—— 缺少$args会导致 GET 参数丢失,路由解析失败 - 确保
location ~ \.php$块中设置了fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;,而不是用$document_root(符号链接场景下会出错) - 检查是否启用了
fastcgi_split_path_info:Yii 需要它把/index.php/user/login拆成脚本路径和 PATH_INFO;没配就会直接 404
示例关键片段:
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_pass 127.0.0.1:9000;
}
Apache 的 .htaccess 不起作用,访问子路由仍是 404
不是规则写错了,而是 Apache 根本没读取或执行它 —— 常见于虚拟主机未开启 AllowOverride All 或 mod_rewrite 未启用。
- 运行
a2enmod rewrite(Debian/Ubuntu)或检查httpd.conf中LoadModule rewrite_module是否取消注释 - 在虚拟主机配置里确认
<directory></directory>下有AllowOverride All,仅AllowOverride None会让 .htaccess 完全失效 - Yii 2.x 的默认
.htaccess依赖mod_env设置环境变量(如ENV=prod),缺失时可能静默失败,建议先临时删掉SetEnv行测试
重写规则看似生效,但后台登录页能打开、其他路由仍 404
这说明入口脚本 index.php 能执行,但 Yii 自身的 URL 解析卡住了 —— 很可能是 urlManager 配置或 Web 服务器传入的原始路径被截断了。
- 检查
urlManager的enablePrettyUrl是否为true,且showScriptName设为false(否则所有 URL 必须带index.php) - 在
index.php开头加一行var_dump($_SERVER['REQUEST_URI'], $_SERVER['SCRIPT_NAME']); die;,看实际传进来的路径是不是被 Nginx/Apache 二次处理过(比如多了一层/web) - 如果项目部署在子目录(如
https://example.com/myapp/),baseUrl和scriptUrl必须显式配置,否则生成的链接和路由匹配都会错位
本地开发用内置服务器(php -S)跑 Yii,一访问就 404
PHP 内置服务器不支持 Apache/Nginx 那套重写逻辑,必须手动指定路由脚本,否则所有非静态资源都 404。
- 启动命令必须带路由文件参数:
php -S localhost:8000 router.php,其中router.php是你自己写的转发逻辑 - Yii 官方推荐的
router.php内容极简:<?phpif (preg_match('/\.(?:png|jpg|jpeg|gif|css|js|woff2?|eot|ttf|svg)$/', $_SERVER["REQUEST_URI"])) {return false;} else {include __DIR__ . '/index.php';} - 注意:不能直接
php -S localhost:8000 index.php,那样只响应根路径,子路由全挂
PATH_INFO 在内置服务器里行为不稳定,建议开发阶段优先用 Nginx 或 Docker 环境,避免被这个细节反复绊倒











