Как заблокировать доступ с определенной строкой в URL-адресе?


На моем сайте раньше был SEO-взлом. Хотя я переустановил веб-сайт, злоумышленник все еще пытается получить доступ к этим URL-адресам через Google или напрямую:

/404.html?page=/wp-content/uploads/2020/03/...
/wp-content/uploads/2020/03/...

Как заблокировать эти доступы? Для /wp-content/uploads/2020/03/... я могу создать файл .htaccess в папке с Deny from all, но как насчет страницы 404? Я прочитал шпаргалку .htaccess, но не нашел там результата.

Author: Ooker, 2020-05-31

1 answers

/404.html?page=/wp-content/uploads/2020/03/...

Я предполагаю, что ... - это "все, что следует". Чтобы заблокировать этот URL-адрес, вы можете использовать mod_rewrite в своем корневом файле .htaccess. Но вам нужно использовать условие (RewriteCond директива), чтобы соответствовать строке запроса.

В RewriteRule шаблон совпадает только с URL-путем (за вычетом префикса каталога), т.е. 404.html. Чтобы соответствовать строке запроса (т. Е. page=/wp-content/uploads/2020/03/...) вам нужно использовать директиву RewriteCond и сопоставить ее с переменной сервера QUERY_STRING.

Для пример, в верхней части вашего корневого файла .htaccess ( перед любыми другими директивами WordPress):

RewriteCond %{QUERY_STRING} ^page=/wp-content/uploads/2020/03/
RewriteRule ^404\.html$ - [F]

Это соответствует точному URL-адресу /404.html?page=/wp-content/uploads/2020/03/, за которым следует что угодно. Обратите внимание на отсутствие префикса косой черты в RewriteRule узор.

Флаг F вызывает немедленный ответ 403 "Запрещено". Флаг L здесь не требуется.

(Вам не нужно повторять директиву RewriteEngine On, если она уже присутствует в разделе WordPress файл .htaccess, даже если он появится позже в файле.)

Если вам нужно быть более общим и соответствовать параметру URL page в любом месте строки запроса и учитывать изменения в случае, если вы можете изменить приведенную выше директиву следующим образом:

RewriteCond %{QUERY_STRING} (^|&)page=/wp-content/uploads/2020/03/ [NC]
RewriteRule ^404\.html$ - [NC,F]

Для соответствия /wp-content/uploads/2020/03/... также требуется отдельное правило. Например:

RewriteRule ^wp-content/uploads/2020/03/ - [F]

(Или используйте директивы блокировки mod_auth... в соответствующем каталоге - как вы упомянули - но обратите внимание, что Deny from all является директивой Apache 2.2. Если вы находитесь на Apache 2.4+ вместо этого вы должны использовать Require all denied.)


В сторону:

Я прочитал шпаргалку .htaccess, но не нашел там результата.

Да, похоже, нет никакого упоминания о сопоставлении с строкой запроса части URL-адреса в .htaccess "шпаргалке". (Распространенное требование и источник ошибок. например здесь, здесь и здесь)

Вы бы использовали тот же метод (т. Е. RewriteCond w/QUERY_STRING переменная сервера) для перенаправления и перезаписи (например, "чистые URL-адреса").


ОБНОВЛЕНИЕ:

Стивен: Предположительно, этот URL вернет статус 404 Не найден...

Должен признать, я вроде как проглядел это! Если один (или даже оба) из этих URL-адресов уже возвращают 404, то вам действительно больше ничего не нужно делать с точки зрения SEO. Разница заключается всего лишь в ответе 403 ("заблокирован") или 404 (не найден). Ни один из которых не будет проиндексирован поисковые системы (со временем все ранее проиндексированные URL-адреса будут удалены из поисковой выдачи).

Единственная мысль (с учетом того, что это WordPress/CMS) заключается в том, что эти 404 будут обрабатываться WordPress, что потенциально может увеличить нагрузку на сервер, если эти URL-адреса будут забиты. В этом случае может быть предпочтительнее обработать это в .htaccess (или предпочтительно в конфигурации вашего сервера).

Вместо того, чтобы возвращать "403 Запрещено", вы могли бы вместо этого вернуть "404 Не найдено", изменив F флаг в вышеприведенных директивах R=404. Обратите внимание, что это вернет ответ Apache 404, а не WordPress.

 3
Author: MrWhite, 2020-05-31 13:38:55