Извините, это может быть легко. Я хотел бы проверить, совпадают ли оба. Значение моего заголовка и HTTP_REFERER
RewriteEngine On
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?alloweddomain.com [NC]
RewriteCond %{HTTP:X-SomeHeader} !somekey
RewriteRule ^ - [F]
В противном случае я хотел бы заблокировать пользователя.
Проверка заголовка работает хорошо, и документы обслуживаются только тогда, когда это правильно. Однако HTTP_REFERER, похоже, игнорируется. Ресурсы обслуживаются даже тогда, когда их нет. F.e с завитком. Как мне нужно изменить условия, которые оба должны соответствовать?
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 Почти, но не совсем (
!=
или=
в середине не является оператором, это просто часть строки, которую нужно сопоставить). Я обновил свой ответ.