You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Yii2高级模板Nginx环境伪静态URL配置失效问题排查

问题分析与解决方案

看起来你遇到的问题主要来自两个方面:Yii2后端的URL路由规则未配置,以及Nginx配置中请求路径的传递逻辑需要调整。下面一步步帮你解决:

1. 完善Yii2后端的URL管理规则

你当前的urlManager配置中rules是空的,Yii2无法自动解析/module/controller/action这种结构的路由。需要添加对应的规则来匹配模块、控制器和动作:

打开backend/config/main.php,更新urlManager配置:

'urlManager' => [
    'enablePrettyUrl' => true,
    'showScriptName' => false,
    'enableStrictParsing' => true, // 开启严格解析,避免不必要的路由匹配
    'rules' => [
        // 匹配带模块的路由:/模块名/控制器名/动作名
        '<module:\w+>/<controller:\w+>/<action:\w+>' => '<module>/<controller>/<action>',
        // 匹配无模块的基础路由:/控制器名/动作名
        '<controller:\w+>/<action:\w+>' => '<controller>/<action>',
        // 默认首页路由
        '' => 'site/index',
    ],
],

同时,确保你的users模块已经在后端配置中注册(如果是自定义模块):

'modules' => [
    'users' => [
        'class' => 'backend\modules\users\Module',
        // 其他模块配置(如需要)
    ],
],

2. 修正Nginx配置,确保请求路径正确传递

你的Nginx配置中,/admin路径的try_files和PHP解析部分需要调整,保证Yii2能获取到完整的请求路由:

调整location /admintry_files规则

将原来的:

try_files $uri $uri/ /backend/web/index.php$is_args$args;

修改为:

try_files $uri $uri/ /backend/web/index.php?$query_string;

这样能确保所有非静态文件的请求都转发到后端的index.php,并且传递完整的查询参数。

优化PHP解析段的rewrite逻辑

你的location ~ ^/.+\.php(/|$)中的rewrite规则可能导致请求路径被错误修改。可以简化这段逻辑,确保/admin开头的请求正确映射到后端的index.php

location ~ ^/.+\.php(/|$) {
    # 处理前端请求
    if ($request_uri !~ ^/(backend/web|admin)) {
        rewrite ^ /frontend/web$uri break;
    }
    # 处理admin请求,传递正确的路径信息给Yii
    if ($request_uri ~ ^/admin(.+)) {
        set $backend_path $1;
        rewrite ^ /backend/web/index.php break;
        fastcgi_param PATH_INFO $backend_path;
    }
    fastcgi_pass 127.0.0.1:9000;
    include /etc/nginx/fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param REQUEST_URI $request_uri; # 确保Yii能获取到原始请求URI
    try_files $fastcgi_script_name =404;
}

这段调整后,会把/admin/users/user/create这类请求的路径/users/user/create通过PATH_INFO传递给后端的index.php,Yii2就能正确解析路由了。

3. 验证配置并重启服务

  1. 保存Yii2的配置文件,清除Yii的缓存(如果开启了缓存):
    cd /var/www/xxxxxxx/html
    ./yii cache/flush-all
    
  2. 重启Nginx和PHP-FPM服务:
    sudo systemctl restart nginx
    sudo systemctl restart php-fpm
    

现在再访问localhost:8080/admin/users/user/create,应该就能正常跳转到对应的模块控制器动作页面了。

内容的提问来源于stack exchange,提问作者Carl35

火山引擎 最新活动