.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=1apikey=somekey 那么您需要求助于以下形式的正则表达式:

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

当URL参数apikey=somekey(精确字符串)包含在任何地方时,条件成功在查询字符串中。