Сегодня мой сервер был завален сотней запросов на страницу контактов моего сайта (/ contact) всего за 2 минуты.
В моем журнале apache есть сотня таких строк:
*31.13.115.6 - - [18/Jun/2019:10:54:39 +0200] "GET /contacto HTTP/1.1" 301 331 "-" "facebookexternalhit/1.1 (+http://www.facebook.com/externalhit_uatext.php)" 232*
*31.13.115.25 - - [18/Jun/2019:10:54:39 +0200] "GET /contacto HTTP/1.1" 301 331 "-" "facebookexternalhit/1.1 (+http://www.facebook.com/externalhit_uatext.php)" 232*
Я не уверен, в чем причина этого, но мой сервер не работал из-за этого. Я хочу убедиться, что этого больше не повторится.
Мой сервер-провайдер сказал, что я могу заблокировать эти запросы, добавив правило в свой .htaccess, используя RewriteCond.
Я знаю, что мне придется использовать что-то вроде:
RewriteCond %{HTTP_USER_AGENT} "facebookexternalhit/1.1"
но я мало что знаю об этом.
Думаю, что знаю, в чем может быть проблема. У меня есть старый сайт oldsite.com, который перенаправляется на мой новый сайт newsite.com. В htaccess oldsite.com я добавил эти строки для создания перенаправления:
Правила в oldsite.com/.htaccess
RewriteEngine on
RewriteRule ^(.*)$ https://www.newsite.com/$1 [R=301,L]
Это правило было создано, потому что я изменил домен своего сайта, то цель этого правила - перенаправлять трафик со старого сайта на новостной без ущерба для SEO.
До сих пор все работало нормально. Как вы думаете, это могло быть причиной этого? Если да, то как вы думаете, мне нужно изменить это правило на www.oldsite.com/.htaccess вместо добавления других правил на www.newsite.com/.htaccess?
Вы заявляете, что эти запросы относятся к вашей странице контактов /contact
однако опубликованные вами записи журнала предназначены для /contacto
(и дополнительное «о»), и они показывают ответ перенаправления 301, который инициирует второй запрос к вашему серверу (при условии, что поисковый робот следует перенаправлениям). Почему есть 301 редирект? На какую страницу вы перенаправляетесь?
Похоже, они действительно относятся к подлинному «сканеру» Facebook, но, как отмечалось в многочисленных вопросах StackOverflow, краулер Facebook действительно склонен к довольно агрессивной деятельности!
RewriteCond %{HTTP_USER_AGENT} "facebookexternalhit/1.1"
В RewriteCond
Директива (условие) сама по себе ничего не делает. Ты нуждаешься в RewriteRule
действительно что-то делать.
Например:
RewriteCond %{HTTP_USER_AGENT} ^facebookexternalhit/1\.1
RewriteRule ^contact$ - [F]
Вышеуказанное отправит 403 Forbidden для всех запросов на /contact
где пользовательский агент начинается с facebookexternalhit/1.1
. (Это регулярное выражение, поэтому буквальная точка должна быть экранирована обратной косой чертой.)
Запрос, естественно, все еще попадает на ваш сервер приложений (чтобы полностью заблокировать запрос, вам понадобится какой-то прокси), но теперь он мало что делает, когда это происходит.
В принятом ответе на связанный вопрос выше говорится об отправке 429 Too Many Requests
статус вместо этого (вместе с Retry-After
header), но это происходит только после определенного количества запросов в быстрой последовательности (предоставляется скрипт PHP).