Консультация № 173354
17.10.2009, 15:05
0.00 руб.
0 1 0
Здравствуйте уважаемые эксперты.
Прошу помочь мне с устранением 406 кода ошибки http, возвращаемое сервером на моём сайте. (webforever.info)
Итак. На днях я сделал кириллические ЧПУ на своём сайте.
При этом в браузерах всё работает, пока ошибок не было найдено ни у кого. Но вот роботам некоторых систем вместо результата выдаётся 406 ошибка. (это получается только для URL с кириллическими символами)
Например, робот Яндекса получает 406 ошибку, а Google обрабатывает всё нормально.
(служба поддержки Яндекса хранит молчание)
Первоначально, я считал что проблема в кодировках - в частности от браузеров URL приходит всегда в скрипт в utf-8 кодировке и его нужно перекодировать в cp1251. (причём так происходит во всех браузерах, которых я проверял из под Linux тоже)
В службе поддержки одной из систем, чей робот возвращает 406 ошибку, мне сказали что запрос URL отправляется в cp1251 кодировке.
Ну бог с этим, сделал исключение - теперь в какой бы из этих двух кодировок не приходил URL всё нормально.
Так же ещё я 2-жды (для надёжности) указываю кодировку в которой работает сайт: есть и
Код:
header('Content-Type: text/html; charset=windows-1251');
и
Код:
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
Однако проблема осталась. При этом сам скрипт запускается! (в частности я сам пока записываю в текстовый файл что происходит и что на выходе). И выяснилось, что скрипт по крайней мере правильно формирует все sql запросы и получает содержимое страницы из БД. Но сервер всё равно отправляет 406 ошибку.
При этом лог-файл ошибок сервера пуст.
Поискав информацию по этой ошибке я узнал что в этом виновата от части система фильтрации атак самого apache. (хотя её такая избирательность мне не совсем понятна).
Но отключить её - прописав в .htaccess инструкцию " SecFilterEngine Off" не получилось - 500 ошибка и запись в лог файле:
Invalid command 'SecFilterEngine', perhaps misspelled or defined by a module not included in the server configuration

Это я так понимаю результат того, что запрещено изменение этой инструкции через .htaccess.

Подскажите, как всё-таки побороть эту 406 ошибку?
И как она вообще вызывается? В частности непосредственно в момент передачи роботу результата выполнения скрипта или же сразу в момент обращения к сайту?
Подозреваю что последнее... но тогда почему сам скрипт выполняется и получает необходимый результат из БД.
При этом ещё используется mod_rewrite в .htaccess а именно следующее правило (см приложение)
т.е. фактически просто всё переадресуется на index.php, в котором уже парсится сам URL

Заранее большое спасибо за ваши ответы.

Приложение:
RewriteEngine On
Options +FollowSymlinks
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php [L]

Обсуждение

Неизвестный
20.10.2009, 21:57
общий
Спустя почти неделю был получен ответ от службы поддержки Яндекса.
А именно:
Проверка показывает, что сервер формирует данный код ответа на запрос
документов в типе text/html. То есть, по какой-то причине, сервер, отдавая
text/html, считает, что он не может быть обработан роботом и формирует ответ
406 Not Acceptable.
Браузерам (например FireFox) отдается страница с кодом 200, так как они
отправляют запрос, который предполагает, что сервер может вернуть любой тип
контента, если нет возможности вернуть text/html, application/xhtml+xml или
application/xml (Accept:
text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8).

Например:
Accept: text/html
Host: www.webforever.info
User-Agent: Yandex/1.01.001 (compatible; Win16; I)

HTTP/1.1 406 Not Acceptable
Date: Mon, 19 Oct 2009 09:03:09 GMT
Server: Apache/2.2.13 (Unix) mod_ssl/2.2.13 OpenSSL/0.9.8e-fips-rhel5
mod_auth_passthrough/2.1 mod_bwlimited/1.4 FrontPage/5.0.2.2635 PHP/5.2.10
X-Powered-By: PHP/5.2.10
Set-Cookie: PHPSESSID=651d2143af6233242b19b29dfb0c674c; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Set-Cookie: auth=deleted; expires=Sun, 19-Oct-2008 09:03:08 GMT; path=/;
domain=webforever.info
Transfer-Encoding: chunked
Content-Type: text/html; charset=windows-1251
А теперь вопрос. Как может сервер такое возвращать? В частности последняя строка:Content-Type: text/html; charset=windows-1251 означает как раз то, что всё возвращается в том формате в котором нужно. Или я что-то не совсем понимаю?
Может есть на форуме кто в серверах хорошо разбирается и обьяснит мне как можно устранить такой глюк? (ну кроме отказа от кириллицы в URL)
Форма ответа