.htaccess 检查 header 和域条件作为链
.htaccess check header and domain conditions as chain
抱歉,这可能很简单。
我想检查两者是否匹配。我的 header 和 HTTP_REFERER
的值
RewriteEngine On
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?alloweddomain.com [NC]
RewriteCond %{HTTP:X-SomeHeader} !somekey
RewriteRule ^ - [F]
否则我想阻止用户。
header 检查效果很好,只有在正确时才会提供文件。但是 HTTP_REFERER 似乎被忽略了。即使资源不存在,也会提供资源。 F.e 卷曲。我需要如何更改两者必须匹配的条件?
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?alloweddomain.com [NC]
RewriteCond %{HTTP:X-SomeHeader} !somekey
RewriteRule ^ - [F]
目前正在检查两者是否不匹配。如果 Referer
header 不存在,但 somekey
已通过,则请求 未 被阻止。
您需要在第一个 条件 上有一个 OR
标记。 IE。如果两者都不匹配,则阻止请求。例如:
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?alloweddomain.com [NC,OR]
RewriteCond %{HTTP:X-SomeHeader} !=somekey
RewriteRule ^ - [F]
您还需要在第二个 CondPattern 上使用 =
运算符进行精确匹配,否则您将检查 somekey
是否存在于传递的 header.
或者,反转逻辑:
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
指令执行(正则表达式)字符串比较。 QUERY_STRING
服务器变量(即 %{QUERY_STRING}
)的值与 string/regex apikey!=somekey
进行比较。这永远不会匹配,因为您应该检查“字符串”apikey=somekey
。 =
(或!=
)不是比较运算符,它只是字符串的一部分。 (不要与 CondPattern 本身(如上所用)上的 !
前缀运算符混淆,后者否定整个表达式。)
要检查字符串“apikey=somekey”是否不包含在 QUERY_STRING
中的任何位置,请使用 CondPattern !apikey=somekey
。但是,这可能过于宽泛,因为(如前所述)这是在检查字符串是否 包含在 QUERY_STRING
中的任何地方 。 fooapikey=somekeybar
形式的查询字符串也会成功。您可以改为执行精确的字符串比较(如上所述)。例如:
RewriteCond %{QUERY_STRING} !=apikey=somekey
如果查询字符串只能包含 apikey
URL 参数而没有其他任何内容,那没关系,但是如果您可能希望在同一请求中包含其他 URL 参数,例如. foo=1&apikey=somekey&bar=1
或 apikey=somekey
那么您需要求助于以下形式的正则表达式:
RewriteCond %{QUERY_STRING} !(^|&)apikey=somekey($|&)
当URL参数apikey=somekey
(精确字符串)不包含在任何地方时,条件成功在查询字符串中。
抱歉,这可能很简单。 我想检查两者是否匹配。我的 header 和 HTTP_REFERER
的值RewriteEngine On
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?alloweddomain.com [NC]
RewriteCond %{HTTP:X-SomeHeader} !somekey
RewriteRule ^ - [F]
否则我想阻止用户。
header 检查效果很好,只有在正确时才会提供文件。但是 HTTP_REFERER 似乎被忽略了。即使资源不存在,也会提供资源。 F.e 卷曲。我需要如何更改两者必须匹配的条件?
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?alloweddomain.com [NC] RewriteCond %{HTTP:X-SomeHeader} !somekey RewriteRule ^ - [F]
目前正在检查两者是否不匹配。如果 Referer
header 不存在,但 somekey
已通过,则请求 未 被阻止。
您需要在第一个 条件 上有一个 OR
标记。 IE。如果两者都不匹配,则阻止请求。例如:
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?alloweddomain.com [NC,OR]
RewriteCond %{HTTP:X-SomeHeader} !=somekey
RewriteRule ^ - [F]
您还需要在第二个 CondPattern 上使用 =
运算符进行精确匹配,否则您将检查 somekey
是否存在于传递的 header.
或者,反转逻辑:
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
指令执行(正则表达式)字符串比较。 QUERY_STRING
服务器变量(即 %{QUERY_STRING}
)的值与 string/regex apikey!=somekey
进行比较。这永远不会匹配,因为您应该检查“字符串”apikey=somekey
。 =
(或!=
)不是比较运算符,它只是字符串的一部分。 (不要与 CondPattern 本身(如上所用)上的 !
前缀运算符混淆,后者否定整个表达式。)
要检查字符串“apikey=somekey”是否不包含在 QUERY_STRING
中的任何位置,请使用 CondPattern !apikey=somekey
。但是,这可能过于宽泛,因为(如前所述)这是在检查字符串是否 包含在 QUERY_STRING
中的任何地方 。 fooapikey=somekeybar
形式的查询字符串也会成功。您可以改为执行精确的字符串比较(如上所述)。例如:
RewriteCond %{QUERY_STRING} !=apikey=somekey
如果查询字符串只能包含 apikey
URL 参数而没有其他任何内容,那没关系,但是如果您可能希望在同一请求中包含其他 URL 参数,例如. foo=1&apikey=somekey&bar=1
或 apikey=somekey
那么您需要求助于以下形式的正则表达式:
RewriteCond %{QUERY_STRING} !(^|&)apikey=somekey($|&)
当URL参数apikey=somekey
(精确字符串)不包含在任何地方时,条件成功在查询字符串中。