CORS - jQuery не может получить статус ответа ajax - PullRequest
0 голосов
/ 05 мая 2018

У меня проблема с вызовом ajax на другой поддомен, запрос отправляется с www.mydomain.test на subdomain1.mydomain.test . Я хочу обработать ошибки 4xx и 5xx, чтобы я мог перенаправить пользователя.

При выполнении из FF или Chromium вызов работает отлично, когда сервер возвращает 200, о проблемах CORS не сообщается, но когда сервер возвращает 4xx, свойство jqXHR.status имеет значение 0 и I получите следующее сообщение CORS на консоли:

Failed to load http://subdomain1.mydomain.test/api.php: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://www.mydomain.test' is therefore not allowed access. The response had HTTP status code 418.

Однако один и тот же вызов всегда завершается успешно при выполнении с почтальоном , даже когда сервер возвращает 418 или любой другой 4xx.

Это код JS, выполненный с сайта www.mydomain.test:

$.ajax({
    url : "http://subdomain1.mydomain.test/api.php",
    type : "POST",
    success: function(response)
    {
        redirectToSucessPage();
    },
    error: function(jqXHR, textStatus, errorThrown)
    {
        console.log(textStatus); //prints out "error"
        console.log(jqXHR.status); //prints out 0

        if(jqXHR.status == 401) //never reached
            redirectToErrorPage();
    }
});

Это полный вывод консоли:

POST http://subdomain1.mydomain.test/api.php 418 ()
Failed to load http://subdomain1.mydomain.test/api.php: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://www.mydomain.test' is therefore not allowed access. The response had HTTP status code 418.
error
0

Сообщение CORS меня точно не беспокоит, хотя я не понимаю, как его получить, поскольку оно происходит только с ответами 4xx, но мне действительно нужен код состояния ответа. Сервер возвращает 418, но jqXHR.status равен 0.

Это nginx конфиг ресурса:

location = /api.php {                   
    root /path/to/dir;

    add_header 'Access-Control-Allow-Origin' 'http://www.mydomain.test';
    add_header 'Access-Control-Allow-Methods' 'POST';

    limit_req   zone=limitZoneOne   burst=5;

    include snippets/fastcgi-php.conf;
    fastcgi_pass unix:/run/php/php7.0-fpm.sock;
}

PHP, который выдает ответ, просто:

http_response_code(418) and exit;

Я делаю ошибку при получении статуса ответа, или есть какая-то проблема CORS с ответами 4xx, о которой я не знаю? Спасибо!

1 Ответ

0 голосов
/ 05 мая 2018

Решено с помощью more_set_headers в nginx.conf вместо add_header:

location = /api.php {                   
    root /path/to/dir;

    more_set_headers 'Access-Control-Allow-Origin:http://www.mydomain.test';
    more_set_headers 'Access-Control-Allow-Methods: POST';

    limit_req   zone=limitZoneOne   burst=5;

    include snippets/fastcgi-php.conf;
    fastcgi_pass unix:/run/php/php7.0-fpm.sock;
}

Работает даже без заголовка Access-Control-Allow-Methods, как для FF, так и для Chromium.

Директива more_set_headers является частью модуля HttpHeadersMore , который входит в состав nginx-extras nginx, вы можете установить его в Ubuntu 16 с помощью делать:

sudo apt-get install nginx-extras

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...