У меня проблема с вызовом 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, о которой я не знаю? Спасибо!