Месяц назад я опубликовал вопрос с отличными ответами (HTACCESS 403: как заблокировать URL-адрес с определенным символом?): HTACCESS 403: как заблокировать URL-адрес с определенным символом?
Проблема в том, что я перенес свой веб-сайт с HTTP на HTTPS, и я хотел бы перенаправить все URL-адреса, кроме URL-адресов спама с определенным символом, который я бы заблокировал с помощью кода 410.
Пример того, что я хотел бы:
http://www.example.com/caterory/article-name/?vn/2022-06-24fivhg585.html ==> 410 code, without 301 to HTTPS
http://www.example.com/caterory/article-name/webhook.php?tw3fpage3rjnso530724 ==> 410 code, without 301 to HTTPS
http://www.example.com/caterory/article-name/football.php?fsmkfpagefgdg456 ==> 410 code, without 301 to HTTPS
Неправильно, сегодня спамные URL имеют код 301, а затем код 410.
http://www.example.com/caterory/article-name/?vn/2022-06-24fivhg585.html ==> 301 to https://www.example.com/caterory/article-name/?vn/2022-06-24fivhg585.html and then ==> 410.
http://www.example.com/caterory/article-name/webhook.php?tw3fpage3rjnso530724 ==> 301 to
https://www.example.com/caterory/article-name/webhook.php?tw3fpage3rjnso530724 and then ==> 410.
http://www.example.com/caterory/article-name/football.php?fsmkfpagefgdg456 ==> 301 to
https://www.example.com/caterory/article-name/football.php?fsmkfpagefgdg456 and then ==> 410.
Я использую эти правила:
RewriteEngine On
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+)$ [NC]
RewriteRule ^.*$ https://www.%1%{REQUEST_URI} [L,NE,R=301]
RewriteEngine On
RewriteCond %{QUERY_STRING} ^vn/ [NC]
RewriteRule ^ - [R=410]
RewriteEngine On
RewriteCond %{THE_REQUEST} /webhook.php [NC]
RewriteRule ^ - [R=410]
RewriteEngine On
RewriteCond %{THE_REQUEST} /football.php [NC]
RewriteRule ^ - [R=410]
У вас есть идея управлять перенаправлением 301, кроме URL-адресов с определенным символом / строкой страниц.
Просто измените порядок правил, чтобы ваши блокирующие директивы были первыми (как и должно быть).
Также нет необходимости повторять директиву RewriteEngine
.
Вместо использования серверной переменной THE_REQUEST
(которая, возможно, слишком сильно соответствует контексту, в котором вы ее используете), вы должны просто использовать шаблон RewriteRule
(или даже объединить правила в одно).
Например:
RewriteEngine On
# Blocking the following requests
RewriteCond %{QUERY_STRING} ^vn/ [NC]
RewriteRule ^ - [R=410]
RewriteRule /webhook\.php$ - [NC,R=410]
RewriteRule /football\.php$ - [NC,R=410]
# Canonical redirect
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+)$ [NC]
RewriteRule ^ https://www.%1%{REQUEST_URI} [L,NE,R=301]
Также обратите внимание, что я упростил регулярное выражение ^.*$
в последнем правиле до просто ^
.
3 правила блокировки можно объединить в одно (но это не принесет никакой пользы). Например:
# Blocking the following requests (combined rule)
RewriteCond %{QUERY_STRING} ^vn/ [OR,NC]
RewriteCond %{REQUEST_URI} /webhook\.php$ [OR,NC]
RewriteCond %{REQUEST_URI} /football\.php$ [NC]
RewriteRule ^ - [G]
# Canonical redirect
:
NB: G
(gone
) — это просто сокращение от R=410
.
Как правило, порядок ваших директив должен быть следующим:
Блокирующие директивы
Внешние перенаправления
Внутренние перезаписи
Неправильно, сегодня спамные URL имеют код 301, а затем код 410.
Хотя на самом деле это не имеет значения, за исключением того, что потенциально использует незначительное количество дополнительных ресурсов. В конечном итоге это все еще 410.
@Arnaud Приведенные выше правила уже сделали бы это. Они не проверяют запрошенную схему (HTTP или HTTPS), поэтому естественным образом блокируют как HTTP, так и HTTPS-запросы.
Ах хорошо, спасибо! Я удалю свой новый ответ ... Наши сообщения пересеклись. Большое, большое спасибо еще раз, вы сделали мой день!
@Арно Не за что. Если это ответило на ваш вопрос, отметьте его как «принятый» (серая/зеленая галочка рядом с моим ответом выше слева под стрелками голосования), чтобы помочь другим читателям и удалить вопрос из очереди вопросов без ответа (вы также получите немного "для этого). Также проголосуйте за ответы, которые вы считаете полезными, и выразите благодарность. Спасибо, очень признателен :)
Я только что протестировал новые правила, но, похоже, они не работают: у меня есть код 404, а также перенаправление на HTTPS.
Любая идея, как я могу сделать? Я использую Nginx и PHP 8.1.13.
@Арно "Nginx"?! .htaccess
— это конфигурационный файл Apache, который не работает на Nginx! (Как это «работало» раньше?)
Я ошибаюсь, это приложение FPM, обслуживаемое режимом Apache + Proxy: прокси-запросы Nginx к Apache + включить кэширование nginx. Это правильно?
@Arnaud Хорошо, в таком случае, если ваши исходные правила работали, как указано (т.е. 301, за которым следует 410), то пересмотренные правила в моем ответе также должны «работать». Ваши правила точно такие, как я изложил выше? А других правил у вас нет? (Теперь мне интересно, почему вы использовали THE_REQUEST
в своих исходных правилах - это было бы необходимо, только если у вас есть шаблон переднего контроллера или URL-адрес не такой, как указано в вопросе?)
Давайте продолжим обсуждение в чате.
Я отправил вам чат. О THE_REQUEST Я только что протестировал некоторые ресурсы, найденные в stackoverflow, прежде чем задавать свои вопросы. У вас есть лучшее решение? Большое большое спасибо !
Здравствуйте, @MrWhite. Я снова попробовал ваш код, и он отлично работает! Может быть, я устал...
Большое спасибо MrWhite! Я попробую ваши правила :) Но я думаю, было бы неплохо иметь также: example.com/caterory/название статьи/… to ==> 410 example.com/caterory/название статьи/футбол .php?fsmkfpagefgdg456 to ==> 410 example.com/caterory/article-name/?vn/2022-06-24fivhg585.html to ==> 410 Ваши правила поддерживают неправильные URL-адреса в https на 410?