Yii2和Yii1.1.32的Nginx配置必须严格区分:Yii2需指向/web子目录、启用try_files及正确SCRIPT_FILENAME;Yii1则需将index.php置于根目录、显式暴露URL且不支持自动重写。

Yii2.0和Yii1.1.32项目部署Nginx配置必须区分框架版本特性:Yii2默认依赖index.php入口+URL重写,Yii1.1.32则需显式暴露index.php且不支持enablePrettyUrl自动降级;若混用同一份配置,Yii1会404、Yii2会漏子目录前缀或跳转到/index.php。
Yii2.0标准Nginx配置(非子目录)
第一步:确认站点根目录指向项目/web子目录,不是项目根目录。宝塔面板添加站点时,“网站目录”必须填/www/wwwroot/myapp/web,否则config/、runtime/路径可被直接访问,存在安全隐患。
第二步:在Nginx配置中启用try_files兜底规则,确保所有非静态资源请求都交由index.php处理:
【location /块内必须写try_files $uri $uri/ /index.php?$args;】——漏掉$uri/会导致访问目录时返回403,漏掉?$args会让GET参数丢失,Url::to()生成的链接带空查询串。
第三步:PHP处理块必须使用$document_root$fastcgi_script_name作为SCRIPT_FILENAME,不能用$request_filename:
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
第四步:检查web.php中urlManager配置是否匹配——若启用enablePrettyUrl,showScriptName必须设为false,否则Nginx重写生效但页面仍显示index.php。
Yii1.1.32兼容性Nginx配置
Yii1.1.32没有内置URL重写引擎,不识别try_files规则,也不支持enablePrettyUrl自动路由降级。它的入口文件index.php必须显式出现在URL中,否则所有请求都会404。
方法一:强制所有请求走index.php(最稳妥)
location / {
try_files $uri $uri/ /index.php?$query_string;
}
方法二:仅对PHP文件启用FastCGI,其余静态资源直出(推荐用于已有.htaccess习惯的迁移场景)
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
【注意:Yii1.1.32的index.php必须放在Web根目录下,不能藏在/web子目录里】——它不像Yii2那样有明确的web/隔离设计,整个项目目录就是DocumentRoot。
子目录部署共用要点(Yii2 + Yii1均适用)
① Nginx location块必须与URL路径严格一致:比如应用部署在https://example.com/admin/,则必须写location /admin/ { … },不能只写location / { … }。
② alias指令末尾必须加斜杠:alias /var/www/html/myapp/web/; ——少这个/会导致PHP脚本404,因为Nginx拼接路径时会丢掉最后一级。
③ Yii2需同步修改三处:
config/web.php中'baseUrl' => '/admin'(开头带/,结尾不带);
urlManager中'scriptUrl' => '/admin/index.php';
Nginx location块内try_files最后一项改为/admin/index.php?$args。
④ Yii1.1.32子目录部署只需改一处:在index.php开头手动设置定义:
define('YII_BASE_URL', '/admin');


















