不使用if如何做到这一点?

时间:2012-10-13 23:26:25

标签: nginx

我有一个列入黑名单的网址,我想查看这些网址是否是特定请求的http_referer。如果他们是我试图设置一个cookie。我曾尝试使用下面的代码:

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

    } 

但是关于nginx中if语句的reading more,听起来我不应该使用它。如何在不使用if声明的情况下完成上述内容?

另外 - 我没有使用nginx的经验,所以如果你看到一种不同的方式我应该检查这个,请随意指出它。

3 个答案:

答案 0 :(得分:1)

如果你想根据Referer添加一个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计算为空字符串,则不会添加标题。

map中,您可以使用完全字符串或正则表达式(带有“〜”或“〜*”前缀)。

请参阅此处了解文档:

您可能还想看看nginx referer module。它的目的是为引用者列入白名单,而不是列入黑名单,使用map的方法对黑名单来说会更容易。

答案 1 :(得分:0)

如果您仔细阅读http://wiki.nginx.org/IfIsEvil,您会注意到:

  1. 如果直接在服务器块中就可以了
  2. 如果位于另一方面的位置区块中,则 除非它们只保留一个返回或重写指令
  3. 所以跟随实际上会完全保存:

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

    换句话说,你不需要摆脱所有ifs

答案 2 :(得分:0)

请注意:nginxreferer module