JQuery - Ajax возвращает ошибку 500 в некоторых сообщениях - PullRequest
6 голосов
/ 06 июля 2010

У меня есть Ajax, который работал на живом сайте, теперь он перестал работать.Ajax должен возвращать страницу, но возвращает ошибку 500 (внутренняя ошибка сервера) .

Странно то, что я могу перемещаться и публиковать на странице, которую вызывает Ajax, поэтомустраница не работает только через Ajax-вызов ($ .post).

Еще одна странная вещь - она ​​работает локально, но не работает.Также все остальные Ajax на сайте работают.

У кого-нибудь есть сомнения, что это может быть?Кстати, все это jQuery с CakePHP.

Edit :

Журналы ошибок apache говорят: «Преждевременный конец заголовков скриптов: php-script, referer ... "

Редактировать 2 :

Все это произошло, когда я переключил сервер на SSL.Это говорит об ошибке выше, а затем «Порт 80».

Ответы [ 9 ]

6 голосов
/ 14 июля 2010

Во-первых, это не имеет ничего общего с заголовками jQuery, AJAX, POST, CakePHP или HTTP. Полное сообщение об ошибке «Преждевременный конец сценария», что означает, что процесс PHP, который использует Apache для запуска сценария PHP, неожиданно завершился (то есть, до того, как процесс PHP завершил свою часть протокола Fast CGI). Обычно это означает, что процесс PHP потерпел крах или вызвал «ошибку сегментации».

Ошибки в сегментации PHP могут быть трудными для устранения, и они никогда не должны возникать; PHP никогда не должен падать. Причиной сбоя может быть ряд причин. Возможно, это простое исправление.

Первое, что я хотел бы сделать, это полностью удалить PHP и установить последнюю стабильную версию. Если вы используете PHP 5.3 и Windows, вам следует использовать только двоичные файлы VC6 (пакет «VC6 x86 Thread Safe»); пакет VC9 вызовет сбой PHP при использовании Apache. Переустановка может решить вашу проблему, потому что библиотеки DLL / SO расширений более ранних версий PHP все еще могут существовать в каталоге расширений на работающем сервере.

Если в Windows используется MySQL, то следующее, что я хотел бы сделать, - убедиться, что каталог MySQL bin находится в Path действующего сервера. Причина этого заключается в том, чтобы убедиться, что libmySQL.dll может быть «найден» ОС. Вы должны иметь возможность подключиться по SSH к работающему серверу, наберите mysql --help и увидите сообщение об использовании клиента MySQL CLI. Перезапустите Apache, если вы добавили каталог MySQL bin в Path.

Если оба эти предложения не помогли решить проблему, обновите свой вопрос, ответив на следующие вопросы:

  1. Вы используете веб-хостинг или ИТ-отдел компании управляет сервером для вашего использования?
  2. Если вы используете веб-хостинг, вы арендуете выделенный сервер?
  3. В какой операционной системе вы работаете?
  4. Какую версию PHP вы используете?
  5. Какие расширения PHP загружаются?
  6. Вы загружаете расширение Zend?
  7. Вы когда-нибудь использовали dl?

ОБНОВЛЕНИЕ: Начиная с версии 5.3.6 и более поздних, проект PHP больше не выпускает установщики "VC6". Рекомендуется установить сборку Apache HTTPD из Apache Lounge и использовать установщик VC9.

4 голосов
/ 06 июля 2010

Проверьте свой apache и php error logs!он будет там


Наиболее частой причиной этой проблемы является смерть сценария перед отправкой на сервер полного набора заголовков или, возможно, вообще каких-либо вообще.Чтобы убедиться, что это так, попробуйте запустить скрипт автономно от интерактивного сеанса, а не как скрипт под сервером.Если вы получаете сообщения об ошибках, это почти наверняка является причиной сообщения «преждевременный конец заголовка скрипта».Даже если CGI работает нормально из командной строки, помните, что среда и разрешения могут отличаться при работе под веб-сервером.CGI может получить доступ только к тем ресурсам, которые разрешены для пользователя и группы, указанных в конфигурации Apache.Кроме того, среда не будет такой же, как в командной строке, но ее можно настроить с помощью директив, предоставляемых mod_env.

Вторая наиболее распространенная причина этого (за исключением людей, не выводящих данные).требуемые заголовки вообще) является результатом взаимодействия с буферизацией вывода Perl.Чтобы заставить Perl очищать свои буферы после каждого оператора вывода, вставьте следующие операторы вокруг операторов print или write, которые отправляют заголовки HTTP:

{
    local ($oldbar) = $|;
    $cfh = select (STDOUT);
    $| = 1;
    #
    # print your HTTP headers here
    #
    $| = $oldbar;
    select ($cfh);
}

Обычно это необходимо, только когда вы вызываете внешние программы из своего скриптакоторые отправляют вывод в stdout, или если между временем отправки заголовков и фактическим содержимым начнется длительная задержка.Чтобы максимизировать производительность, вы должны выключить очистку буфера (с $ | = 0 или эквивалентной) после операторов, которые отправляют заголовки, как показано выше.

Если ваш скрипт не написан на Perl,выполните аналогичные действия для любого языка, который вы используете (например, для C, вызовите fflush () после записи заголовков).

Другой причиной появления сообщения «преждевременный конец заголовков сценария» являются директивы RLimitCPU и RLimitMEM,Вы можете получить сообщение, если скрипт CGI был убит из-за ограничения ресурсов.

Кроме того, проблема с конфигурацией в suEXEC, mod_perl или другом стороннем модуле часто может мешать выполнению вашего CGI и вызыватьсообщение «преждевременный конец заголовка скрипта».


CPHP:

1 голос
/ 09 августа 2010

Взято из http://henrik.nyh.se/2007/04/premature-end-of-script-headers-for-cgi-can-be-directory-permissions

Кроме причин, изложенных в FAQ по Apache, сообщение об ошибке «Преждевременный конец заголовков сценариев» для сценария CGI (в моем случае сценарий Ruby наDreamhost) также может означать, что каталог, содержащий скрипт, доступен для записи всем пользователям.

Таким образом, права доступа к папкам, такие как drwxr-xrwx, могут вызывать эту ошибку.chmod 755 mydir изменит эти разрешения на drwxr-xr-x, и все будет хорошо.

Я полагаю, что Apache / suEXEC имеет проблемы с запущенным материалом, который может редактировать любой злой пользователь.

Стоит проверить права доступа к каталогу.

В отдельной заметке вы говорите, что проблема возникла при изменении сайта на использование SSL, однако в ошибке упоминается порт 80. Порт 80 используется для стандартного трафика HTTP, однако порт 443используется для трафика SSL - если трафик проходит через порт 80, это может быть неверная конфигурация сервера, HTTP, где должен быть HTTPS, или проблема с вашим сертификатом.Я видел подобные ошибки, возникающие при истечении срока действия сертификата.Используют ли оба URL-адреса (вызывающая страница и сценарий) SSL?

0 голосов
/ 06 июля 2018

У меня тоже была такая проблема, в моем случае решением было заменить файл php.ini на чистый.

0 голосов
/ 12 января 2015

Вам следует проверить php error.log, в моем случае я установил тип кэша с помощью redis, однако он не работает правильно.

0 голосов
/ 15 июля 2010

Я бы хотел бросить свои 2 цента, но это происходит в несколько ином направлении, и у вас могут быть или не быть прямые ресурсы для устранения неполадок, но об этом стоит подумать.

В общем, хотя, это ошибка PHP, и мы можем исключить проблемы на стороне клиента.Кроме того, в моей повседневной работе (устранение неполадок в сети), если что-то работает, а затем останавливается, я сразу же думаю «что изменилось».Если вы ничего не добавили в сценарий, и у пользователя нет возможности повлиять на сценарий во время выполнения, тогда я бы сразу начал думать: «О-о, что с инфраструктурой».Это особенно верно, если что-то работает локально, но не через Интернет.

Проверяли ли вы наличие плохой памяти на сервере или плохих сетевых карт (если плохие сетевые карты, это объясняет, почему работает один интерфейс, а не другой).).У вас есть доступ к этому или он размещен (может ли ваш хост проверить)?

Далее я бы начал думать, хорошо, память сервера в порядке, и это, скорее всего, неисправная сетевая карта, связанная с ней, в противном случае она могла бы выйти из строя споратно и в других местах,Тем не менее, может быть в сети, хотя.Существует ли устройство безопасности, которое может манипулировать пакетами в любом месте микса (NIDS / HIDS, WAF, прокси и т. Д.). Видите ли вы какие-либо проблемы с пакетами в сети (дубликаты, не в порядке, не фрагментировать и т. Д.).

Я буду честен, если бы кто-то позвонил мне и описал ваши проблемы, первое, что я хотел бы сказать, это «проверить журналы IPS», примерно 85% - это проблема.Ложные срабатывания могут сделать это, и все, что нужно, это одно автоматическое обновление на брандмауэре ...

Надеюсь, это поможет.

0 голосов
/ 13 июля 2010

Возможно, производственный сайт нарушает политику с тем же происхождением .

URL в браузере до третьей косой черты должен точно соответствовать URL в вашем AJAX POST, иначе ограничения безопасности браузера для Javascript будут отклонять ответ. Сервер может фактически увидеть запрос и ответить правильно, но браузер передает пустую строку обратно вызову AJAX.

0 голосов
/ 12 июля 2010

Эта ошибка немного проблематична, потому что она может быть вызвана многими причинами.

Что делает ваша страница ...? Вот несколько предложений.

Если ваша страница похожа на страницу автозаполнения, поэтому вы передаете немного информации и получаете отфильтрованный список результатов ... Возможно, ваш AJAX-скрипт не передает элемент данных, и ваша страница пытается вернуть все. Действительно громоздкие PHP-скрипты (т.е. интенсивные / рекурсивные операции) могут вызвать эту ошибку.

Обычный совет для решения этой конкретной ошибки - вернуться к стабильной странице, а затем снова начать добавлять материал - так что, возможно, направьте свой AJAX-скрипт на страницу с такой ...

<?php
    echo 'If this appears, we\'re stable!';
?>

Затем постепенно добавляйте блоки своего кода, пока не столкнетесь с проблемой. Моя предлагаемая версия 2 этой страницы будет ...

<?php
    print_r($_POST);
?>

Поскольку это позволит вам проверить, что возвращается в форме сообщения.

Если все вышеперечисленное не выполнено, укажите следующее ...

1) Описание того, что делает ваша PHP-страница, или, возможно, пример кода. 2) Код JavaScript, который вызывает страницу PHP.

0 голосов
/ 06 июля 2010

Вы можете использовать Fidler , чтобы проверить, что сервер вернул за этот $ .post.Он будет содержать веб-страницу, которая была бы возвращена, если бы вы запустили этот же метод непосредственно в браузере.

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