
Кто-то в моей студии несколько лет назад разработал веб-страницу, и теперь клиент решил сменить сервер (он перешел на сервер Linux Apache с Gen2 SMP, 64 бит, PHP версии 5.3.8, Standard MYSQL версии 5). Внезапно он начал делать странные вещи.
При нажатии на ссылку, требующую входа, страница перенаправляет вас на страницу входа с помощью header()
функции в PHP. Любопытно, что страница показывает это:
ХОРОШО
Сервер столкнулся с внутренней ошибкой или неправильной конфигурацией и не смог выполнить ваш запрос. Пожалуйста, свяжитесь с администратором сервера, [адрес не указан] и сообщите ему время возникновения ошибки и все, что вы могли сделать, что могло вызвать ошибку. Дополнительная информация об этой ошибке может быть доступна в журнале ошибок сервера. HTTP/1.1 200 OK Дата: Пн, 15 Окт 2012 17:27:32 GMT Сервер: Apache/2.2.22 (Unix) FrontPage/5.0.2.2635 X-Powered-By: PHP/5.3.8 Истекает: Чт, 19 Ноя 1981 08:52:00 GMT Управление кэшем: без сохранения, без кэша, обязательно для повторной проверки, после проверки=0, предварительная проверка=0 Прагма: без кэша Keep-Alive: время ожидания=5, макс=399 Подключение: Keep-Alive Кодировка передачи: фрагментированная Тип содержимого: text/html 232c
Затем сама страница, а затем еще один заголовок:
0 1f4
ХОРОШО
Сервер столкнулся с внутренней ошибкой или неправильной конфигурацией и не смог выполнить ваш запрос. Пожалуйста, свяжитесь с администратором сервера, [адрес не указан] и сообщите ему время возникновения ошибки, а также все, что вы могли сделать, что могло вызвать ошибку. Дополнительная информация об этой ошибке может быть доступна в журнале ошибок сервера. 0
Самое интересное, что если обновить страницу или нажать Enter на URL, она загружается правильно. Я проверял логи, и там только ругается на несуществующий favicon. Я также проверил .htaccess, все было правильно (RewriteBase был / как и предполагалось, и единственное, что там есть, это еще одно правило, которое перемещает запросы ^en/ в request?lang=en. Кто-нибудь сталкивался с чем-то подобным?
Редактировать: IE не запускает эти два заголовка. Это становится все страннее.
Решение!: Как указал @adaptr, это был вопрос PHP, а не серверной части. Последний кодер (знаю, невежливо обвинять предшественника, но эта ситуация отняла у меня слишком много времени) сделал это:
/* config.php -> included everywhere as a bootstrap*/
// ... constant/mysql setup
if($notLogged)
{
$forward = ...;//previous url
header("Location: ".WWW.LANG."/customer-area/login/index.php?forward=".$forward);
exit;
}
После более глубокого изучения, что-то меня скрутило: exit;
правильно ли будут отправлены заголовки или нет? Конечно, удаление этого exit;
продолжит выполнение страницы (я знаю, что это совсем не правильно, поэтому я не пробовал это раньше). Однако, если заголовки не будут отправлены полностью, это может вызвать любую проблему (я не серверный парень, я не уверен в этом, извините, друзья). После удаления этого exit;
вызова страница была правильно сформирована, заголовки были "закрыты" (из-за начала вывода), и все шестеренки снова начали двигаться. Спасибо всем, ребята, лучшие 100 очков =)
решение1
Если в журналах Apache не обнаружено никаких ошибок, это означает, что PHP обработал все это, а также вернул клиенту странные ответы.
Включите правильное ведение журнала PHP и выясните, что он делает.
Этот фрагмент ответа показателен:
Кодирование передачи: фрагментированное
Это означает, что PHP отправляет ответ в потоке (text/html), которыйне имеет определенного размера содержимогов заголовках.
Это может привести к тому, что любой вывод заголовка (который PHP часто кэширует, т.е. генерируется не в том порядке), который даже немного сбивается, заставляя клиента думать, что отправляется новая страница.
Это лишь одна из возможных причин; правильное ведение журнала PHP расскажет вам больше.
решение2
Вам нужно отладить код страницы, а не искать причину на сервере. Из того, что вы разместили, я вижу, что он был создан с помощью FrontPage (серьезно, профессионал использовал его?), поэтому он неизбежно содержит код, который не будет работать должным образом на платформе, отличной от Microsoft. Исправьте код, удалив весь специфичный для Microsoft код, и он может работать правильно.