Я бы хотел заблокировать все запросы, начинающиеся с /search?q=
поскольку они создают нежелательную нагрузку на мой сервер.
После этого вопроса https://stackoverflow.com/questions/4640807/how-to-block-bot-requests-to-urls-that-match-a-common-pattern-in-apache , Я попробовал следующий код:
<Location />
RewriteEngine On
RewriteCond %{REQUEST_URI} ^/search?q=[^/] [NC]
RewriteRule ^.*$ - [F,L]
</Location>
но он блокирует слишком много URL-адресов (как и все, что начинается с поиска)
Я пробовал разные варианты, но они не работали. Какой будет правильный синтаксис?
но он блокирует слишком много URL-адресов (как и все, что начинается с поиска)
Код, который вы разместили, этого не сделает? На самом деле, опубликованный вами код вряд ли что-то заблокирует, если только не был закодирован URL ?
(т.е. %3F
) в исходном URL-адресе запроса?
Однако, чтобы соответствовать строке запроса (т.е. q=
) то вам нужно сопоставить QUERY_STRING
серверная переменная. В REQUEST_URI
Переменная сервера Apache содержит только URL-путь (без строки запроса).
Итак, чтобы заблокировать все запросы, которые запускаются /search?q=
тогда вам понадобится что-то вроде следующего:
RewriteCond %{QUERY_STRING} ^q=
RewriteRule ^/?search$ - [F]
Это гарантирует соответствие URL-пути /search
и строка запроса начинается q=
.
В NC
флаг не требуется, если вам не нужно также сопоставлять Q=
в строке запроса.
В L
флаг не требуется с F
флаг, как это подразумевается.
UDPATE: Я помещаю эти директивы прямо в конфигурацию сервера, потому что у меня много виртуальных хостов (веб-сайтов) на этом сервере, и я хотел бы, чтобы это правило применялось ко всем.
Это, наверное, твоя проблема. Директивы mod_rewrite в конфигурации сервера по умолчанию переопределяются виртуальным хостом и фактически игнорируются. VHosts не будет наследовать директивы mod_rewrite из конфигурации сервера, если вы специально не включите наследование mod_rewrite, что вы обычно делаете из контейнера vhost. Однако в Apache 2.4.8+ вы можете сделать это в конфигурации основного сервера (сервер контекст). Например:
RewriteOptions InheritDownBefore
InheritDownBefore
обеспечивает выполнение директив в конфигурации сервера перед директивы в хосте.