Nginx 如何在不使用if的情况下执行此操作?

Nginx 如何在不使用if的情况下执行此操作?,nginx,Nginx,我有一个黑名单的网址,我想检查一下,看看他们是否是一个特定请求的http_参考。如果是的话,我正在试着做一块饼干。我曾尝试使用以下代码执行此操作: set $blackListUrls "www.somesite.com,www.anothersite.com,www.yetanother.com"; location / { if($blackListUrls ~* $http_referer){...} } 但是关于nginx中的if语句

我有一个黑名单的网址,我想检查一下,看看他们是否是一个特定请求的http_参考。如果是的话,我正在试着做一块饼干。我曾尝试使用以下代码执行此操作:

    set $blackListUrls "www.somesite.com,www.anothersite.com,www.yetanother.com";
    location / {
            if($blackListUrls ~* $http_referer){...}

    } 
但是关于nginx中的
if
语句,听起来我不应该使用它。如果不使用
if
语句,我如何完成上面所说的内容


另外-我没有使用nginx的经验,因此如果您看到不同的方法,我应该检查它,请随意指出。

如果您想添加基于
引用器的cookie,类似的方法应该可以:

map $http_referer $setcookie {
    default                "";
    http://some.exact.url  "cookiename=cookievalue";
    ~*example\.com         "cookiename=cookievalue";
    ...
}

server {
    ...
    location / {
        add_header Set-Cookie $setcookie;
        ...
    }
}
它将$http_referer变量(即
referer
头)映射到$setcookie变量中,默认为空(如果映射中列出了referer,则不为空)。
add_header
指令用于使用$setcookie值添加
Set Cookie
头。如果$addcookie的计算结果为空字符串,则不会添加标头

映射中
可以使用精确的字符串或正则表达式(前缀为“~”或“~*”)

有关文档,请参见此处:

您可能还想看看nginx。它的设计目的是将推荐人列入白名单,而不是列入黑名单,使用
map
将更容易列入黑名单。

如果仔细阅读,您会注意到:

  • 如果直接在服务器块中,则可以
  • 另一方面,位置块中的if未保存,除非它们只持有return或rewrite指令
  • 因此,以下内容实际上是完美的保存:

    server {
      location / {
        set blackListUrls "www.somesite.com,www.anothersite.com,www.yetanother.com";
        if($blackListUrls ~* $http_referer){return 403;}
      } 
    } 
    

    换句话说,您不需要删除所有的ifs,请注意:
    nginx
    已经有了。

    很有趣。那么您的示例
    ~*example\.com
    是否匹配:
    www.example.com
    example.com
    http://example.com
    etc?是的,它将匹配“example\.com”正则表达式,不区分大小写。有关文档的链接,请参见上文。