Предполетный канал CORS не удался.Только в Firefox.Хром отлично работает - PullRequest
0 голосов
/ 11 июня 2018

Итак, у меня необычная проблема, я не знаю, как отладить.У меня есть приложение angular 4, которое использует cakephp на стороне сервера.

В моем приложении у меня есть несколько разных экранов, к которым я могу получить доступ нормально, кроме одного, и это единственная проблема с Firefox.Я могу открыть это нормально, если я использую хром.Я получаю следующее предупреждение в firefox

Запрос перекрестного источника заблокирован: политика одинакового источника запрещает чтение удаленного ресурса по адресу 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');

Inжурнал, который я вижу, выводится по-разному для Firefox и Chrome.В FF я получаю следующее:

2018-06-10 22:33:48 Отладка: это действие: options

В Chrome он отличается

2018-06-10 22:41:44 Отладка: это действие: getNetworkSeries

Это началось только после того, как я обновил с угловой 2 до угловой 5. Я не уверен, чтоэто как-то связано с этим, но в моем старом env все работает нормально, но я не могу заставить его работать сейчас с firefox.Любые идеи о том, как я начинаю отлаживать что-то вроде этого?

Обновление:

Я пытался изменить URL-адрес запроса, чтобы использовать IP-адрес вместо имени сервера, и это не имело значения.

Обновление:

В журналах php я вижу, что при попытке перенаправить на правильный контроллер произошла ошибка

018-06-11 10:20:32 Ошибка: [MissingControllerException] Класс контроллера Cross-seriesController не найден.Атрибуты исключений: массив ('class' => 'Cross-seriesController', 'plugin' => NULL,) URL запроса: / api / cross-series / network-series Трассировка стека:

Iне могу понять, откуда он получает Cross-seriesController в качестве URL:

/ api / cross-series / network-series

и маршрут для этого

 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

1 Ответ

0 голосов
/ 11 июня 2018

Нашел решение.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();
}
...