【问题标题】:Yii routing when using multiple modules使用多个模块时的 Yii 路由
【发布时间】:2013-10-14 21:27:00
【问题描述】:

我们最近重新安装了我们的生产服务器,我们有一个运行多个模块的 Yii 项目。在重新安装之前,路由部分运行良好。我们多次检查 Nginx 配置是否有问题,但一切看起来都不错,实际上我们从旧服务器复制了工作配置。

问题是,每个请求(在任何子域上)都会导致 CHttpException:Unable to resolve the request "default/site/index". 即使我们调用任何控制器或其他任何东西。

我打开了一个新的子域(没有指定规则),只是为了测试,它也重定向到这个错误。 (即使我们在没有最后两条规则的情况下尝试过)

Yii 的路由规则如下:(print_r 的结果)

[http://www.domain.dk/<controller:\w+>/<action:\w+>/<wid:\w+>] => default/<controller>/<action>
[http://www.domain.dk/<controller:\w+>/<action:\w+>] => default/<controller>/<action>
[http://www.domain.dk/] => default/site/index
[http://api.domain.dk/<controller:\w+>/<action:\w+>/<wid:\w+>] => api/<controller>/<action>
[http://api.domain.dk/<controller:\w+>/<action:\w+>] => api/<controller>/<action>
[http://api.domain.dk/] => api/
[http://admin.domain.dk/<controller:\w+>/<action:\w+>/<wid:\w+>] => admin/<controller>/<action>
[http://admin.domain.dk/<controller:\w+>/<action:\w+>] => admin/<controller>/<action>
[http://admin.domain.dk/] => admin/site/index
[https://facebook.domain.dk/<controller:\w+>/<action:\w+>/<wid:\w+>] => facebook/<controller>/<action>
[https://facebook.domain.dk/<controller:\w+>/<action:\w+>] => facebook/<controller>/<action>
[https://facebook.domain.dk/] => facebook/site/index
[http://domain.dk/site/page/view/<view:\w+>/] => default/site/page
[http://<module:\w+>.domain.dk/<controller:\w+>/<action:\w+>/<wid:\w+>] => <module>/<controller>/<action>
[http://<module:\w+>.domain.dk/<controller:\w+>/<action:\w+>] => <module>/<controller>/<action>

所有 Nginx 配置如下所示:

server {
        listen 80;
        server_name api.domain.dk;

        access_log /log/api.domain.dk_access.log;
        error_log /log/api.domain.dk_error.log;

        root /path.to.project/public_html;

        include yii-rules.conf;
}

yii-rules.conf 文件有共同的规则,例如:(我只复制能有所作为的内容)

charset utf-8;

index index.php;

location / {
        index  index.html index.php;
        try_files $uri $uri/ /index.php?$args;

        add_header 'Access-Control-Allow-Origin' '*';
        add_header 'Access-Control-Allow-Credentials' 'true';
        add_header 'Access-Control-Allow-Methods' 'GET, PUT, POST, OPTIONS';
        add_header 'Access-Control-Allow-Headers' 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
}

location ~ \.php {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;

        #let yii catch the calls to unexising PHP files
        set $fsn /index.php;
        if (-f $document_root$fastcgi_script_name){
                set $fsn $fastcgi_script_name;
        }

        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fsn;

        #PATH_INFO and PATH_TRANSLATED can be omitted, but RFC 3875 specifies them for CGI
        fastcgi_param  PATH_INFO        $fastcgi_path_info;
        fastcgi_param  PATH_TRANSLATED  $document_root$fsn;
}

我们没有想到什么会导致这个错误,可能只是一个我们没有注意到的小问题:\

这个错误不会对我们的日志产生任何影响(当然只有访问日志)并且yii访问日志只是在写入,我们在浏览器中可以看到:“无法解析...”

我们应该如何更改配置或规则列表以避免此错误?

【问题讨论】:

  • 您以前的主机(路由部分运行良好)是由 Windows 操作的吗?当前主机是 Linux 吗?
  • 是的,我读过很多关于区分大小写的问题,但这里不是这种情况:\ 我们正在使用 Ubuntu 12.04。之前也是。

标签: php yii nginx yii-routing


【解决方案1】:

搞定!​​

这是一件小事,花了一天多的时间才找到,因为它没有显示任何错误:

我们有我们的主配置文件,我们使用“自定义”配置文件,专门针对服务器或开发机器,它是 gitignored。 所以问题是,我们将 2 个配置与 PHP 内置的 array_merge 合并。

CMap::mergeArray 解决了我们的问题。

我们的其他配置和网络服务器都很好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-05
    • 2014-04-03
    • 1970-01-01
    • 1970-01-01
    • 2016-07-29
    • 2018-05-12
    • 2017-09-18
    • 2018-01-07
    相关资源
    最近更新 更多