宝塔面板配置yii2伪静态规则需设运行目录为/web、选yii2模板、确保重写规则含if (!-e $request_filename) { rewrite ^(.*)$ /web/index.php?$1 last; },子目录部署需调整路径前缀,必要时删除fastcgi_split_path_info并重启站点。

宝塔面板配置Yii2伪静态规则是为了让网站URL更简洁、SEO更友好,同时避免访问路由时出现404错误;Yii2默认依赖PATH_INFO模式解析URL,若Nginx未正确重写请求到index.php,所有非根路径(如/user/login、/admin/dashboard)都会直接返回404。
确认Yii2部署方式与运行目录
进入宝塔【网站】→点击目标站点【设置】→切换至【网站目录】选项卡。
检查【运行目录】是否设为【/web】——这是Yii2标准结构中public入口目录,必须精确匹配,不能留空、不能填/或/public;若项目结构是/www/wwwroot/myapp/web,则运行目录必须选/web,否则Nginx找不到index.php就会全站404。
保存后无需重启,root指令热生效。
选择并验证伪静态模板
在同个站点设置窗口中,切换到【伪静态】选项卡。
下拉菜单中【选择“Yii2”模板】——注意不是“ThinkPHP”或“Laravel”,Yii2对PATH_INFO和QUERY_STRING处理逻辑特殊,混用模板会导致$_GET['r']丢失或路由解析失败。
点击保存后,立即查看文本框内生成的规则内容:必须包含且仅包含以下核心行:
if (!-e $request_filename) { rewrite ^(.*)$ /web/index.php?$1 last; }
若看到的是try_files $uri $uri/ /index.php?$args; 或 rewrite ^(.*)$ /index.php?s=$1 last;,说明模板选错或被手动覆盖,需清空后重选Yii2。
手动修正关键参数(必要时)
方法一:适配子目录部署
若Yii2部署在二级路径如https://example.com/app/,则原规则会把/app/user/login误导向/web/index.php?/app/user/login,导致路由错乱;此时需手动修改为:
if (!-e $request_filename) { rewrite ^/app/(.*)$ /app/web/index.php?$1 last; }
注意:rewrite开头的路径前缀(/app/)必须与实际访问URL完全一致,大小写、末尾斜杠均不可差。
方法二:修复PATH_INFO截断问题
宝塔自动生成的Yii2规则默认不启用fastcgi_split_path_info,但部分Nginx版本需显式关闭该指令,否则Yii2的Yii::$app->request->pathInfo为空;打开【网站】→【设置】→【配置文件】页签,滚动到底部,在location ~ \.php$块内查找fastcgi_split_path_info行,【若存在,整行删除】,保留fastcgi_param PATH_INFO $request_uri;即可。
强制重载并验证生效
第一步:点击【保存】伪静态规则。
第二步:返回【网站】列表页,找到该站点,点击右侧【重启】按钮——不是“重载配置”,也不是“重载Nginx”,必须点站点级【重启】,否则Nginx不会重新加载该server块中的location配置。
第三步:终端执行nginx -t确认语法无误;再执行curl -I https://your-domain.com/site/index,观察响应头中HTTP/1.1 200 OK是否出现,而非404。
第四步:访问任意后台路由如/user/login,页面能正常加载即表示伪静态已生效。











