HTACCESS 301: Как перенаправить все URL-адреса на HTTPS, кроме URL-адресов спама с определенным символом?

Месяц назад я опубликовал вопрос с отличными ответами (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-адресов с определенным символом / строкой страниц.

Как установить LAMP Stack 1/2 на Azure Linux VM
Как установить LAMP Stack 1/2 на Azure Linux VM
В дополнение к нашему предыдущему сообщению о намерении Azure прекратить поддержку Azure Database для MySQL в качестве единого сервера после 16...
2
0
60
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Просто измените порядок правил, чтобы ваши блокирующие директивы были первыми (как и должно быть).

Также нет необходимости повторять директиву 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.

Как правило, порядок ваших директив должен быть следующим:

  1. Блокирующие директивы

  2. Внешние перенаправления

  3. Внутренние перезаписи

Неправильно, сегодня спамные URL имеют код 301, а затем код 410.

Хотя на самом деле это не имеет значения, за исключением того, что потенциально использует незначительное количество дополнительных ресурсов. В конечном итоге это все еще 410.

Большое спасибо MrWhite! Я попробую ваши правила :) Но я думаю, было бы неплохо иметь также: example.com/caterory/название статьи/… to ==> 410 example.com/caterory/название статьи/футбол .php?fsmkfpagefgdg‌​456 to ==> 410 example.com/caterory/article-name/?vn/2022-06-24fivhg585.htm‌​l to ==> 410 Ваши правила поддерживают неправильные URL-адреса в https на 410?

Arnaud 10.01.2023 12:54

@Arnaud Приведенные выше правила уже сделали бы это. Они не проверяют запрошенную схему (HTTP или HTTPS), поэтому естественным образом блокируют как HTTP, так и HTTPS-запросы.

MrWhite 10.01.2023 13:15

Ах хорошо, спасибо! Я удалю свой новый ответ ... Наши сообщения пересеклись. Большое, большое спасибо еще раз, вы сделали мой день!

Arnaud 10.01.2023 13:18

@Арно Не за что. Если это ответило на ваш вопрос, отметьте его как «принятый» (серая/зеленая галочка рядом с моим ответом выше слева под стрелками голосования), чтобы помочь другим читателям и удалить вопрос из очереди вопросов без ответа (вы также получите немного "для этого). Также проголосуйте за ответы, которые вы считаете полезными, и выразите благодарность. Спасибо, очень признателен :)

MrWhite 10.01.2023 13:26

Я только что протестировал новые правила, но, похоже, они не работают: у меня есть код 404, а также перенаправление на HTTPS.

Arnaud 10.01.2023 13:53

Любая идея, как я могу сделать? Я использую Nginx и PHP 8.1.13.

Arnaud 10.01.2023 14:14

@Арно "Nginx"?! .htaccess — это конфигурационный файл Apache, который не работает на Nginx! (Как это «работало» раньше?)

MrWhite 10.01.2023 14:49

Я ошибаюсь, это приложение FPM, обслуживаемое режимом Apache + Proxy: прокси-запросы Nginx к Apache + включить кэширование nginx. Это правильно?

Arnaud 10.01.2023 14:59

@Arnaud Хорошо, в таком случае, если ваши исходные правила работали, как указано (т.е. 301, за которым следует 410), то пересмотренные правила в моем ответе также должны «работать». Ваши правила точно такие, как я изложил выше? А других правил у вас нет? (Теперь мне интересно, почему вы использовали THE_REQUEST в своих исходных правилах - это было бы необходимо, только если у вас есть шаблон переднего контроллера или URL-адрес не такой, как указано в вопросе?)

MrWhite 10.01.2023 15:09

Давайте продолжим обсуждение в чате.

Arnaud 10.01.2023 15:20

Я отправил вам чат. О THE_REQUEST Я только что протестировал некоторые ресурсы, найденные в stackoverflow, прежде чем задавать свои вопросы. У вас есть лучшее решение? Большое большое спасибо !

Arnaud 10.01.2023 15:58

Здравствуйте, @MrWhite. Я снова попробовал ваш код, и он отлично работает! Может быть, я устал...

Arnaud 16.01.2023 14:26

Другие вопросы по теме