2

我有一个列入黑名单的 URL 列表,我想检查它们是否是特定请求的 http_referer。如果他们是我正在尝试设置一个cookie。我试过用下面的代码来做:

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

    } 

但是在阅读更多关于ifnginx 中的声明时,听起来我不应该使用它。if我怎样才能在不使用语句的情况下做我上面所说的事情?

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

4

3 回答 3

1

如果你想添加一个基于 的 cookie Referer,这样的东西应该可以工作:

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

server {
    ...
    location / {
        add_header Set-Cookie $setcookie;
        ...
    }
}

它将 $http_referer 变量(即Refererheader)映射到 $setcookie 变量中,默认为空(如果映射中列出了 referer,则不为空)。该add_header指令用于添加Set-Cookie带有 $setcookie 值的标题。如果 $addcookie 计算结果为空字符串,则不会添加标头。

map您可以使用精确的字符串或正则表达式(带有“~”或“~*”前缀)。

有关文档,请参见此处:

您可能还想看一下 nginx referer 模块。它旨在将推荐人列入白名单,而不是列入黑名单,并且map对于黑名单而言,使用方法会更容易。

于 2012-10-14T00:19:18.623 回答
0

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

  1. 如果直接在服务器块中就可以了
  2. 另一方面,如果在 location 块中,除非它们仅包含 return 或 rewrite 指令,否则它们是未保存的

所以跟随实际上将是完美的保存:

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

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

于 2012-10-14T09:43:12.860 回答
0

请注意:nginx推荐人模块

于 2012-10-14T15:21:44.477 回答