Я использую свой клиент JavaScript (скажем, foo.js
) для вызова моего php Ajax-кода на сервере (скажем, bar.php
). Это работает отлично в большинстве случаев, но время от времени я возвращаю HTTP 403 (Forbidden) вместо обычного 200 (OK). Это происходит с использованием одного и того же кода, одинаковых параметров и т. Д.
Почему это происходит? Как я могу это исправить? Есть ли шанс, что это происходит из-за некоторых действий внутри моего bar.php
кода? Как я могу объяснить причину этого?
Клиент foo.js
:
function postAjax(url, queryString, callback) { var x = new XMLHttpRequest(); x.onreadystatechange = function() { if (x.readyState === 4) { // 4=after HTTP response content finished loading if (x.status === 200) callback(true, x.responseText); else callback(false, x.status); } }; x.open('POST', url, true); x.setRequestHeader('X-Requested-With', 'XMLHttpRequest'); x.setRequestHeader('Content-type','application/x-www-form-urlencoded'); x.send(queryString); } var params = 'aaa=xxx&bbb=yyy'; postAjax('bar.php', params, myCallback); function myCallback(ajaxStatus, ajaxResponse) { /* do something */ }
Сервер bar.php
:
<?php header('Content-Type: text/plain'); $isAjax = isset($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) === 'xmlhttprequest'; if ($isAjax) { /* Do something with $_POST['aaa'] and $_POST['bbb'] */ echo 'Success'; } else { echo 'Error'; } ?>
Добавлена новая информация:
Консоль браузера (в этом примере Firefox):
Когда все хорошо (большую часть времени):
+ POST http://example.com/bar.php 200 OK ZZZms
При ошибке (например, после 7-го раза я последний раз пробовал):
+ POST http://example.com/bar.php 403 Запретный X ZZZms
и я возвращаюсь в 403 в ajaxResponse, который исходит от x.status
Развернув «+» в консоли Firefox, я вижу ответ:
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"> <html><head> <title>403 Forbidden</title> </head><body> <h1>Forbidden</h1> <p>You don't have permission to access /bar.php on this server.</p> <p>Additionally, a 404 Not Found error was encountered while trying to use an ErrorDocument to handle the request.</p> </body></html>
Глядя на Apache Raw Accwss Log (через cPanel), я вижу аналогичную строку POST для всех, с изменением статуса с 200 до 404 в 7-м тесте:
<my IP> - - [17/Jan/2015:09:55:50 -0500] "POST /bar.php HTTP/1.1" 404 - "<my test url>" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:35.0) Gecko/20100101 Firefox/35.0"
«У вас нет разрешения на доступ» ???
Почему у меня есть разрешение 6 раз, но не в 7-й раз?
Глядя на журнал ошибок Apache (через cPanel) за одно и то же время, я вижу строку:
[Sat Jan 17 09:55:50 2015] [error] [client <my IP>] File does not exist: /home/<my user>/public_html/403.shtml, referer: <my test url>