G|Translate: English EN Deutsch DE Italiano IT Русский RU Español ES Українська UK

Обработка Error 404 в WordPress

5/5 - (1 голос)

Очень полезная вещь! Что это? Какие-то таинственные заклинания?

Обработка Error 404 в WordPress

Да, это волшебство поможет резко снизить нагрузку на сервере от всяких сумасшедших роботов.

Суть проблемы ошибки 404 в WordPress.

Все ошибки 404 (нет запрошенной страницы) WordPress обрабатывает самостоятельно. Это здорово придумано, можно делать свою красивую страницу 404 – и будет счастье.

Но в интернете развелось очень много желающих сломать Ваш сайт и постоянно роботы (сетевые боты) делают проверки вида:

  • domen,ru/pass.php
  • domen,ru/login.php
  • domen,ru/administrator.php

и прочая ахинея

Обработка Error 404 в WordPress

Обратите на временной интервал подборщиков:

  • 6:44
  • 6:46
  • 6:48
  • 6:49
  • 6:50
  • 6:51

и на каждое такое обращение WP генерирует страницу 404…

Можно поискать плагин, который пишет ошибки не в базу, а в файл на сервере (пока не нашел, напишу сам). При наличии файла на сервере – можно подключить fail2ban (и скормить ему этот файл) и блочить тупых ботов по IP после трех-пяти ошибок 404.

Плюс часть “умных” утащили с Вашего сервера картинки себе на сайт методом “copypaste” – т.е. картинки на чужом сайта по-прежнему загружаются с Вашего сервера (и дополнительно его используют).

И  после того, как Вы переделали свою исходную статью и картинки к ней (часть удалили, например) – Ваш WordPress начнет генерировать ошибку 404 на каждую отсутствующую картинку! Причем по одной странице 404 на каждую картинку!

Жесть какая, да? Нам нужно оставить генерацию 404 средствами WordPress только для отсутствующих страниц.

Возвращаем управление Error 404 серверу Apache

В WopdPress принудительно сделана передача себе обработки 404. Нужно изменить файл .htaccess, что бы движок обрабатывал только отсутствующие страницы (а не файлы).

Вот собственно код для модуля  mod_rewrite.c (поделились добрые люди)

# BEGIN WordPress

<IfModule mod_rewrite.c>
RewriteEngine On 
RewriteBase / 
RewriteRule ^index\.php$ - [L] 
 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_URI} \.(php|s?html?|css|js|jpe?g|png|gif|ico|txt|pdf)(/?\?.*)?$ 
RewriteRule . - [R=404,L] 

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule . /index.php [L] 
</IfModule>

# END WordPress

Синим цветом – от WordPress, красным – в центре добавлены изменения:

  • запрос файла
  • проверка расширения
  • действие -> 404

 

Этот код полностью переключит всю обработку 404 на Apache для соответствующих расширений файлов.

Обратите внимание на регулярное выражение s?html? – это означает целый набор расширений файлов:

  • shtml
  • shtm
  • html
  • htm

Знак вопрос в регулярном выражении разрешает повторение предыдущего символа 0 или 1 раз. Конструкция jpe?g работает аналогично – это или jpg или jpeg

Если Вам надо оставить обработку файлов .html на WordPress, а все остальные варианты htm отдать Apache – можно сделать так

s?htm|shtml – т.е. отдаем Apache три варианта (вертикальная черта означает “или”)

  • shtm
  • htm
  • shtml

Можно еще добавить расширений файлов, которые любят роботы-подборщики

  • yml – Yandex Market Language – для загрузки прайс-листов в Маркет
  • swp – файл обмена виртуальной памяти
  • bak – архивные файлы чего-либо
  • xml – разметка xml
  • env – настройка переменных среды Unix
  • sql – дамп базы данных MySql
  • dat – файл хранения необработанных данных
  • new – не знаю почему, но роботы пробуют
  • zip, gzip,rar – файлы архивов
  • log – файлы логов
  • suspected – расширение, которое присваивает антивирус хостера для зараженных файлов (index.php -> index.php.suspected)
  • 7z – файл архива
  • gz – файл архива
  • tar – файл архива

И еще для особо продвинутых (любопытных) ботов надо запретить:

  • тильду на конце расширения файла – т.е. вот такой вариант domen.ru/abcd.php~ (тильда в некоторых ОС используется как временно сохраненная версия)
  • и слеш в конце – т.е. вот такой вариант тоже не должен обрабатываться 404  в WP – domen.ru/abcd.php/

Добавляем после скобки с расширениями файлов еще скобку (\/?~?) – принцип тот же (символ на конце может быть а может и не быть) – это и /? и ~?

Лишний бэкслеш нужен для экранирования обычного слеша – т.к. он является системным символом.

Исключаем robots.txt из обработки Apahce

ВАЖНО: использование txt в списке расширений отключит генерацию виртуального файла robots.txt средствами WordPress (при отсутствии физического файла robots.txt на сервере). Просто запрос domen.ru/robots.txt не дойдет до сервера PHP.

Для исключение файла /robots.txt из обработки ошибки 404 средствами Apache – его надо добавить в условие (исключить ТОЛЬКО robots.txt)

RewriteCond %{REQUEST_URI} !^/robots\.txt$

  • символ ! означает отрицание
  • символ ^ означает, что проверяется совпадение с начала строки
  • символ \ означает, что следующий символ является просто символом, а не управляющим символом (наша точка перед txt) – в данном случае не критично (в regex точка означает одиночное совпадение с любым символом, в т.ч. и с точкой)
  • символ $ означает (без доллара никуда…), что мы не только слева проверяем наличие robots.txt, но и справа. Символы txt справа – они последние в проверке. Без $ мы заодно исключим варианты для обработки Apache (а оно нам надо?)
    • robots.txt~
    • robots.txt/ 
    • и так далее

 

Итоговая конструкция (которая в середине файла .htaccess) будет иметь вид

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_URI} !^/robots\.txt$
RewriteCond %{REQUEST_URI} \.(php|asp|suspected|log|xml|s?htm|shtml|css|js|yml|swp|bak|env|new|sql|dat|zip|gzip|rar|7z|tar|gz|jpe?g|svg|png|gif|ico|txt|pdf)(\/?~?)$
RewriteRule . - [R=404,L]

Решение этого вопроса на WordPress (вариант и для Nginx)

How do I skip wordpress’s 404 handling and redirect all 404 errors for static files to 404.html?

https://wordpress.stackexchange.com/questions/24587/how-do-i-skip-wordpresss-404-handling-and-redirect-all-404-errors-for-static-fi

Вносим корректировки в .htaccess 

ВАЖНО:  ручная корректировка файла .htaccess не поможет, WordPress контролирует его содержимое и периодически возвращает свои исходные настройки в блоке, выделенному тэгами 

# BEGIN WordPress

# Директивы (строки) между `BEGIN WordPress` и `END WordPress`
# созданы автоматически и подлежат изменению только через фильтры WordPress.
# Сделанные вручную изменения между этими маркерами будут перезаписаны.

# END WordPress

Используйте плагин, которые умеет его редактировать и перехватывает управление WP, например

Плагин All in One SEO Pack

Вот его раздела “Редактор файлов”

Обработка Error 404 в WordPress

Или через использование хуков и функций WordPress

Вот в этой статье подробно написано, как это сделать

Вред от страницы 404 в WordPress или не загружаем страницу 404, если это файл

ВАЖНО: разработчики WordPress периодически что-то изменяют – обратите внимание на появление в WoprdPress 5.6 новой  инструкции

RewriteRule .* – [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

Поэтому можно вообще сделать отдельным блоком до модуля Вордпресса

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !^/robots\.txt$
RewriteCond %{REQUEST_URI} \.(php|asp|suspected|log|xml|s?htm|shtml|css|js|yml|swp|bak|env|new|sql|dat|zip|gzip|rar|7z|tar|gz|jpe?g|svg|png|gif|ico|txt|pdf)(\/?~?)$
RewriteRule . - [R=404]
</IfModule>
# BEGIN WordPress
# Директивы (строки) между `BEGIN WordPress` и `END WordPress`
# созданы автоматически и подлежат изменению только через фильтры WordPress.
# Сделанные вручную изменения между этими маркерами будут перезаписаны.
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress

 

Обязательно в нашем правиле RewriteRule убираем флаг L (который Last – т.е. последнее перенаправление). Иначе часть инструкций ниже от WP работать не будет.

И конструкцию <IfModule mod_rewrite.c></IfModule> тоже крайне желательно использовать – она дает серверу исполнять инструкции внутри, если уставлен mod_rewrite.c для Apache.  У 99% хостеров он установлен по умолчанию – но на всякий случай пусть будет.

Результат обработки 404 со стороны Apache

ВАЖНО: весь этот список файлов (по их расширениям) не блокируется Apache – мы просто ему возвращаем управление ошибкой 404 при отсутствии какого-либо файла с этим расширением. Если  файл есть или расширение не запрещенное (в данном случае html разрешено) – Apache пропускает url в обработку WordPress.

Раз

Обработка Error 404 в WordPress

Два

Обработка Error 404 в WordPress

Три

Обработка Error 404 в WordPress

Красота же :)

Нагрузка на сервер PHP падает на 50% – теперь ему не нужно обрабатывать 404 в ответ на тупые подборы…

Оставим только медиа для APACHE

Вроде всё хорошо, и Апач быстрый – но b “мамкиных” хакеров много.

Вот такое безобразие может быть

https://site.ru/site.php71
https://site.ru/site.php72
https://site.ru/site.php73
https://site.ru/site.php74
https://site.ru/site.php75

Причем скрипт подборщика делает это 60 раз в минуту (и в user agent = python) – т.е. APACHE занят полностью и никто к Вам на сайт из живых людей не зайдет.

Имеет смысл оставить 404 ошибку через APACHE только для медиафайлов – а всё остальное пропускать в WordPress. Делать лог и баннить :)

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !^/robots\.txt$
RewriteCond %{REQUEST_URI} \.(jpe?g|svg|png|gif|ico)(\/?~?)$
#media only
RewriteRule . - [R=404]
</IfModule>
# BEGIN WordPress
# Директивы (строки) между `BEGIN WordPress` и `END WordPress`
# созданы автоматически и подлежат изменению только через фильтры WordPress.
# Сделанные вручную изменения между этими маркерами будут перезаписаны.
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress

Далее php-скриптом формируем лог ошибок 404 на сервере и отдаем в блокировку fail2ban.

В результате IP такого вредителя блокируется на уровне сервера (NetFilter)  на 1 неделю – 1 месяц.

В принципе обработку 404 ошибки в логе можно оставить и в APACHE, но не удобно:

  • это не ошибка вебсервера – это отсутствие URL
  • все ответы сервера 200…400…500 пишутся в лог доступа, а в не лог ошибок
  • если сайтов несколько – будут отдельные логи для каждого сайта

Плюс достаточно сложная логика обработки статуса 404:

  • это могут быть боты поисковых систем – их не надо блокировать
  • это могут быть ошибки реальных пользователей
  • вообще кто угодно и что угодно может набрать в строке браузера

Проще всю логику сделать на PHP, чем на регулярных выражениях при настройке fail2ban.

 

Подпишитесь в VKontakte - нажмите кнопку
Подпишитесь в Telegram - нажмите кнопку
Наша группа ODNOKLASSNIKI

Вы можете сохранить ссылку на эту страницу себе на компьютер в виде htm файла




Пишите на электронную почту (тема и email будут добавлены автоматически в письмо)

В Вашем браузере должна быть настроена обработка ссылок mailto

site_post@bk.ru

или просто скопируйте адрес e-mail



Последние публикации

  • Статьи от: Автор
  • Рубрика: Блог
  • Сортировка: дата публикации по убыванию

Как сделать перенос длинной ссылки (URL) на другую строку

16.08.2022
Публикация 2 года назад
Длинная ссылка URL выходит за пределы блока Вот, например, ссылка на сайт MS https://docs.microsoft.com/ru-ru/microsoftteams/platform/concepts/build-and-test/deep-links?tabs=teamsjs-v2 При просмотре на широком экране все в порядке. В мобильной версии сайта ссылка выходит за пределы блока и браузер рисует лишнее место справа. Вроде немного ссылка за пределы блока вышла - но получается так. И самое плохое - наша кнопка "Обратная связь" оказалась за пределами экрана мобильной версии. Особенно такая беда в бесплатных темах WordPress. Как это исправить? Нам нужен CSS для указания переноса строк Таблицы каскадных стилей управляют выводом браузера на экран. Кратко о...
(Читать полностью...)

Ограничение 100 Мб для бесплатной версии All-in-One WP Migration

31.05.2022
Публикация 2 года назад
Есть такой плагин для архивирования сайта  All-in-One WP Migration Читаем статью Плагины для архивирования и переноса сайта Было так: тестовый вариант до 64 Мб бесплатный вариант (расширение Basic) до 500 Мб выше 500 Мб сайт - платный вариант А стало так: бесплатный вариант до 100 МБ платный вариант - сайты более 100 Мб Ссылка на расширение к плагину https://import.wp-migration.com/en Чувствуете, что одной колонки не хватает? Остался вариант только  "премиум". Причем при создании архива Вам плагин ничего не сообщает, что правила игры изменились. Плагин дает возможность создать архив для любого объема сайта. В результате архив у Вас есть - а...
(Читать полностью...)

Новые столбцы в админке WordPress

22.02.2022
Публикация 3 года назад
Как добавить свои столбцы в административной панели WordPress Нужно в простом варианте сделать несколько вещей: создать саму колонку и его название (через add_filter) заполнить его данными (через add_action) при необходимости включить возможность сортировки колонки (через add_filter) Создаем колонку // создаем новую колонку для записей add_filter( 'manage_'.'post'.'_posts_columns', 'tsl_manage_pages_columns', 4 ); function tsl_manage_pages_columns( $columns ){ $columns = array( 'views' => 'Визиты' ); return $columns; } Итого в массиве $columns появится новый элемент (обычно в самом конце) Заполняем...
(Читать полностью...)

Функция PHP date() и ядро WordPress

20.11.2021
Публикация 3 года назад
Это же просто. Возвращается текущая дата и текущее локальное время сервера (с правильно установленной таймзоной). Вот каждый может проверить https://wpavonis.ru/server.php Но если запустить этот же код из среды WordPress - мы получим другие результаты UTC 2021-11-20 07:42:01 Что это за фокус? Почему время по Гринвичу  и таймзона другая? WordPress живет в прошлом? ДА! Как говорится - "это не баг, а фича". При запуске ядро WP устанавливает таймзону на UTC. Сделано это специально. Вот тут подробнее. https://wp-kama.ru/function/current_time ВАЖНО: Функция учитывает время сервера установленное в date.timezone setting и переписывает его в момент инициализации системы,...
(Читать полностью...)

Обновление плагина вывода списка страниц в конце поста

20.04.2021
Публикация 4 года назад
Вышла версия 1.9 плагина tsl-plugin-out-list-posts Страница плагина находится здесь Плагин вывода анонсов постов в конце контента Плагин добавляет в конце текста анонсы дочерних или одноуровневых страниц для текущего контента. Логика вывода: список дочерних страниц при отсутствии дочерних страниц - выводятся страницы одного уровня при наличии и дочерних страниц и страниц одного уровня - выводятся дочерние страницы на верхнем уровне при отсутствии дочерних страниц ничего не выводится   По умолчанию выводятся первые 700 знаков текста и миниатюра. Для примера дерево страниц. Верхняя страница Средняя страница 1 Средняя страница 2 Средняя страница...
(Читать полностью...)

Прячем информационные файлы WordPress

13.02.2021
Публикация 4 года назад
После установки WordPress в папке сайта создаются несколько информационных файлов Это собственно файлы: license.txt readme.html Их можно просмотреть через прямой доступ в строке URL. Ранее в файлах добрый WP указывал установленную версию, чем облегчал работу хакеров. Теперь убрали, но нельзя гарантировать, что в будущих обновлениях снова не добавят. Поэтому лучше закрыть. Совет "Удалить после установки!" не подходит - т.к. при обновлении эти файлы будут восстановлены. Файл license.txt Описание лицензии GPL и указание на CMS WP  Файл readme.html Общее описание WordPress Файл wp-config-sample.php Это, собственно, не информационный файл. Это образец для создания...
(Читать полностью...)

WordPress 5.6 – результаты поиска на сайте стали попадать в индекс

05.02.2021
Публикация 4 года назад
В версии WP 5.6 страница с результатами поиска изменилась и стала попадать в индекс поисковых машин Что это такое?  А это теперь WordPress оптимизировал URL выдачи результатов внутреннего поиска в виде domen.ru/search/term Ранее было domen.ru/? s = term И побежали радостные китайские боты заводить в поиск всякую чепуху. Если в этот момент на страницу заходит поисковый  робот: он её проверяет получает ответ от сервера 200 ОК  (даже при отрицательных результатах поиска!) ой и радостно сохраняет в индексе Вот так это выглядит в строке URL   Для запрета поисковым роботам индексации необходимо добавить в файл robots.txt инструкцию Disallow: /search Это запрет на индекс...
(Читать полностью...)

В WP 5.6 добавлена базовая авторизация HTTP

26.01.2021
Публикация 4 года назад
Можно увидеть в файле .htaccess новую строку Это добавлена возможность создавать пароли приложений: на сайте должно быть включено шифрование SSL (протокол HTTPS) для API WP для защиты мобильного входа в админку xml-rpc.php (через сервер WordPress) Подробнее можно прочитать в статье  Пароли приложений (авторизация) Сделано на основе плагина Application Passwords Пароли можно установить в управлении учетной записью пользователя Смысл в том, что Вы указываете мобильное приложение на своем смартфоне (которое, например, WordPress), создаете для него пароль = и Вы можете входить в мобильную версию админки (только с данного устройства) без основного пароля...
(Читать полностью...)