Не найдено: /406.shtml из Джанго

Я запускаю django с apache fcgi на общем хосте. Я настроил его на сообщать об ошибках 404 и сохранять вижу Not Found: /406.shtml по электронной почте (я предполагаю, что s это потому, что это только https). Однако у меня есть документы об ошибках, уже настроенные в .htaccess:

ErrorDocument 406 /error/406.html

Я получал кучу похожих ошибок 404 от django перед настройкой ErrorDocument для каждой из них, но это все еще происходит для 406. Из grep 406 через журнал ошибок apache я иногда вижу ошибку 406 (не 404) для 406.shtml, например следующее, но не так часто, как django пишет мне по электронной почте:

[Fri ...] [error] [client ...]
    ModSecurity: Access denied with code 406 (phase 1).
    Pattern match "Mozilla ... AhrefsBot ...)" at REQUEST_HEADERS:User-Agent.
    [file "/usr/local/apache/conf/mod_sec/mod_sec.hg.conf"] [line "126"]
    [id "900165"] 
    [msg "AhrefsBot BOT Request"]
    [hostname "www.myhostname.com"]
    [uri "/406.shtml"]
    [unique_id "..."]

Я даже не уверен, что это apache перенаправляется внутренне на 406.shtml и перенаправляется на django, или какой-то бот пытается найти 406.shtml напрямую. Первое указывает на проблему с ErrorDocument. Последнее на самом деле не моя проблема, но тогда либо я должен видеть 404 для 406.shtml в журналах apache, либо вообще ничего, потому что django будет обрабатывать 404? Как я могу отследить его дальше?

Мне не удалось воспроизвести проблему, просто посетив мой сайт, но я хотел бы знать, что происходит.


person jozxyqk    schedule 02.02.2016    source источник


Ответы (1)


У вас установлен ModSecurity в вашем Apache, который представляет собой WAF, который пытается защитить ваш сайт от атак, ботов и тому подобного. К сожалению, они, как и спам по электронной почте, являются неотъемлемой частью работы веб-сайта.

ModSecurity — это дополнительный модуль к Apache, который позволяет вам определять правила, а затем запускает каждый запрос в соответствии с этими правилами и решает, блокировать ли запрос или нет.

В этом случае правило (900165, определенное в файле "/usr/local/apache/conf/mod_sec/mod_sec.hg.con) решило заблокировать этот запрос со статусом 406 на основе пользовательского агента (AhrefsBot).

Ahref — это веб-сайт, который сканирует сеть, пытаясь создать базу данных ссылок. Он используется SEO-специалистами, чтобы узнать, кто ссылается на ваши веб-сайты (обратные ссылки очень важны для SEO), поскольку Google (который, по вашему мнению, будет лучшим поставщиком такого рода информации) предоставляет только образцы ссылок, а не полный список.

Опасен ли AhrefBot и нужно ли его блокировать? Ну это вопрос мнения. Предполагая, что это действительно AhrefBot (некоторые гнусные боты могут притворяться им, чтобы выглядеть законными, поэтому проверьте IP-адрес, чтобы увидеть имя хоста, с которого он пришел), тогда он, вероятно, тратит ваши ресурсы впустую, не принося вам особой пользы. С другой стороны, это цена открытой паутины. Ваш веб-сайт доступен для общественности, а также для тех, кто пишет ботов и инструменты (хорошие или плохие).

Почему он возвращает 406? Вот как определяется ваш ModSecurity и/или ваше правило. Проверьте конфигурацию Apache. 406 немного необычно, так как обычно ожидается 403 (отказано в доступе) или 500 (внутренняя ошибка сервера).

Что за файл 406.shtml? Что я не понимаю. .shtml — это HTML-файл, который также позволяет серверной стороне включать другие файлы и код в HTML-файл. Честно говоря, они больше не используются, так как PHP и/или другие языки более распространены. Это может быть атака: т.е. кто-то пытается загрузить файл 406.shtml, а затем вызывает его, чтобы он «выполнялся» и включал содержимое файла, потенциально предоставляя доступ к файлам, которые Apache может видеть, которые недоступны на веб-сервере, или пользователь запросил что (по какой-то причине) или Apache настроен, чтобы показать, что для ошибок 406 или правило ModSecurity перенаправляет на этот файл.

Надеюсь, это дает хороший фон, и лучшее, что я могу предложить, это просмотреть ваш файл конфигурации Apache и любые другие файлы конфигурации, которые он загружает (включая файл mod_sec.hg.con, который он должен загрузить), чтобы полностью понять вашу настройку. и. Решите, нужно ли вам что-то здесь делать.

Вы можете сделать одну из нескольких вещей:

  1. Оставить как есть. ModSecurity делает то, что ему было сказано, и блокирует это с помощью 406.
  2. Отключите это правило и разрешите AhrefRef, чтобы вас это не насторожило.
  3. Измените конфигурацию/правило ModSecurity, чтобы возвращать ошибку, отличную от 406, чтобы вы могли игнорировать ее.
  4. Полностью отключите ModSecurity. Я думаю, что это хороший и полезный инструмент, но для получения максимальной отдачи от него требуется некоторое время и усилия.
  5. Правильно настройте страницу ошибки 406. Для этого вам нужно понять, почему в данный момент он пытается вернуть 406.shtml.

Также не уверен, какие из этих параметров доступны для вас, поскольку вы находитесь на общем хосте и не можете иметь полный доступ. Если это так, обратитесь за советом к своему хостинг-провайдеру.

person Barry Pollard    schedule 02.02.2016
comment
Итак, проблема связана с конфигурацией apache где-то, поскольку он должен обслуживать мой 406 ErrorDocument, но вместо этого пытается 406.shtml, который обрабатывается django как 404? - person jozxyqk; 02.02.2016
comment
Или запрос на самом деле для файла 406.shtml и по совпадению также возвращает 406! Но догадаться вряд ли. - person Barry Pollard; 02.02.2016