我有一个列入黑名单的网址,我想查看这些网址是否是特定请求的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的经验,所以如果你看到一种不同的方式我应该检查这个,请随意指出它。
答案 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,您会注意到:
所以跟随实际上会完全保存:
server {
location / {
set blackListUrls "www.somesite.com,www.anothersite.com,www.yetanother.com";
if($blackListUrls ~* $http_referer){return 403;}
}
}
换句话说,你不需要摆脱所有ifs
答案 2 :(得分:0)
请注意:nginx
有referer module。