.htaccess проверить заголовок и условия домена как цепочку

Извините, это может быть легко. Я хотел бы проверить, совпадают ли оба. Значение моего заголовка и HTTP_REFERER

RewriteEngine On
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?alloweddomain.com [NC]
RewriteCond %{HTTP:X-SomeHeader} !somekey
RewriteRule ^ - [F]

В противном случае я хотел бы заблокировать пользователя.

Проверка заголовка работает хорошо, и документы обслуживаются только тогда, когда это правильно. Однако HTTP_REFERER, похоже, игнорируется. Ресурсы обслуживаются даже тогда, когда их нет. F.e с завитком. Как мне нужно изменить условия, которые оба должны соответствовать?

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

Ответы 1

Ответ принят как подходящий
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?alloweddomain.com [NC]
RewriteCond %{HTTP:X-SomeHeader} !somekey
RewriteRule ^ - [F]

В настоящее время проверяется соответствие обоих нет. Если заголовок Referer отсутствует, но somekey передается, то запрос блокируется нет.

Вам нужен флаг OR на первом состояние. т.е. Если они не совпадают, заблокируйте запрос. Например:

RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?alloweddomain.com [NC,OR]
RewriteCond %{HTTP:X-SomeHeader} !=somekey
RewriteRule ^ - [F]

Вам также нужен оператор = во втором CondPattern для точного совпадения, иначе вы проверяете, существует ли somekey где-либо в переданном заголовке.

ИЛИ, измените логику:

RewriteCond %{HTTP_REFERER} ^http(s)?://(www\.)?alloweddomain.com [NC]
RewriteCond %{HTTP:X-SomeHeader} =somekey
RewriteRule ^ - [S=1]
RewriteRule ^ - [F]

Если оба совпадают, следующее правило, блокирующее запрос, пропускается.


Обновлено:

but a GET parameter, can you guide how I would do that? This is what I've tried RewriteCond %{QUERY_STRING} apikey!=somekey

С помощью директивы RewriteCond вы выполняете сравнение строк (regex). Значение серверной переменной QUERY_STRING (т. е. %{QUERY_STRING}) сравнивается со строкой/регулярным выражением apikey!=somekey. Это никогда не совпадет, так как вы должны проверять «строку» apikey=somekey. = (или !=) не является оператором сравнения, это просто часть строки. (Не путать с оператором префикса ! в самом CondPattern (как указано выше), который отрицает все выражение.)

Чтобы убедиться, что строка «apikey=somekey» не содержится нигде в QUERY_STRING, используйте CondPattern!apikey=somekey. Однако это потенциально слишком широко, поскольку (как уже упоминалось) это проверяет, что строка не является содержится где угодно в QUERY_STRING. Строка запроса вида fooapikey=somekeybar также будет успешной. Вместо этого вы можете выполнить точное сравнение строк (как указано выше). Например:

RewriteCond %{QUERY_STRING} !=apikey=somekey

Это нормально, если строка запроса может состоять только из параметра URL apikey и ничего больше, но если вы потенциально ожидаете другие параметры URL в том же запросе, например. foo=1&apikey=somekey&bar=1 или apikey=somekey то вам нужно прибегнуть к регулярному выражению вида:

RewriteCond %{QUERY_STRING} !(^|&)apikey=somekey($|&)

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

@toni Почти, но не совсем (!= или = в середине не является оператором, это просто часть строки, которую нужно сопоставить). Я обновил свой ответ.

MrWhite 08.04.2022 11:32

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