Как заблокировать доступ с определенной строкой в 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, но не нашел там результата.
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.