cakephp CORS预检通道未成功,仅在Firefox中,Chrome工作正常

x7rlezfr  于 2022-11-12  发布在  PHP
关注(0)|答案(2)|浏览(112)

所以我有一个不寻常的问题,我不知道如何去调试。我有一个angular 4应用程序,它在服务器端使用cakephp。
在我的应用程序中,我有许多不同的屏幕,我可以访问ok,除了一个,这是唯一的问题与火狐。我可以打开它ok,如果我使用铬。我得到以下警告在火狐
已阻止跨源请求:同源策略不允许阅读位于http://localhost:8080/api/cross-series/network-series的远程资源。(原因:CORS预检通道未成功)。
这是我用来导航到屏幕的链接

<div class = "col-xs-4 col-sm-4 col-md-4 col-lg-4"  [routerLink]="['/dashboards/cross-series/network',{networkId:3}]">

            <img src = "assets/img/networks/com-circle.png" class = "cross-series-navigation-icon clickable"
                 alt = "Com"/>

        </div>

然后在php中,我有以下代码用于Cors

$this->response->header('Access-Control-Allow-Origin', 'http://localhost:4200');
//  $this->response->header('Access-Control-Allow-Origin', 'http://localhost:8066');
        $this->response->header('Access-Control-Allow-Credentials', 'true');
        $this->response->header('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, DELETE');
        $this->response->header('Access-Control-Allow-Headers', 'Origin, Authorization, X-Requested-With, Content-Type, Accept, Cache-Control');

        header_remove('X-Powered-By'); //remove default PHP header

        array_push($this->allowedActions, 'options');

        CakeLog::debug("This is the action: " . print_r($this->action, true), 'debug');

在日志中,我可以看到Firefox和Chrome的输出是不同的。
2018年6月10日22:33:48调试:这是动作:选项
在Chrome中,
2018年6月10日22:41:44调试:这是动作:获取网络系列
这是我从angular 2升级到angular 5后才开始的。我不确定这是否与它有关,但在我的旧env中,它工作正常,但我现在不能让它在火狐上工作。关于我如何开始调试这样的东西有什么想法吗?
更新:
我试过更改请求URL以使用IP地址而不是服务器名称,但没有效果。

更新日期:

我可以在我的php日志中看到,尝试路由到正确的控制器时出现错误
018-06-11 10:20:32错误:[MissingControllerException]无法找到控制器类跨系列控制器。异常属性:array('类' =〉'跨系列控制器','插件' =〉NULL,)请求URL:/api/跨系列/网络系列堆栈跟踪:
我不知道它从哪里得到的跨系列控制器的网址是:
/api/跨系列/网络系列
这条路线是

Router::connect('/cross-series/network-series',
                array(
                    'controller' => 'Series',
                    'action' => 'getNetworkSeries',
                    '[method]' => 'POST',
                    'ext' => 'json',
                ) );

这些是http请求标头

Host: localhost:8080 User-Agent: Mozilla/5.0 (X11; Linux x86_64; 

User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Firefox/60.0 
Accept: text/html 
Accept-Language: en-US,en;q=0.5 
Accept-Encoding: gzip, deflate 
Access-Control-Request-Method: POST 
Access-Control-Request-Headers: content-type 
Origin: http://localhost:4200 
Connection: keep-alive Pragma: no-cache Cache-Control: no-cache
ovfsdjhp

ovfsdjhp1#

找到了解决方案。Firefox使用选项对标头进行预检。
我在PHP中添加了代码来处理响应

if($this->request->is("options")){

    $this->response->header('Access-Control-Allow-Origin','http://localhost:4200');
    $this->response->header('Access-Control-Allow-Methods','*');
    $this->response->header('Access-Control-Allow-Credentials', 'true');

    $this->response->header('Access-Control-Allow-Headers','Content-Type, Authorization');

    $this->response->send();

    $this->_stop();
}
e4yzc0pl

e4yzc0pl2#

我也遇到了同样的问题,因为状态代码是404,所以只需要单独处理请求类型选项,并确保状态代码应为200

相关问题