nginx的valid_referers配置

3,761 阅读2分钟

一、valid_referers

HTTP Referer是Header的一部分,当浏览器向Web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的,服务器借此可以获得一些信息用于处理,例如校验加载图片、文件等来源是否是指定域名,如不是则禁止访问。因此HTTP Referer头信息是可以通过程序来伪装生成的,所以通过Referer信息防盗链并非100%可靠,但是,它能够限制大部分的盗链情况。

image.png

image.png

二、详细配置、使用场景

none:表示无Referer值的情况。
blocked:表示Referer值被防火墙进行伪装。
server_names:表示一个或多个主机名称。从Nginx 0.5.33版本开始,server_names中可以使用通配符"*"号。
nginx会通过查看referer字段和valid_referers后面的referer列表进行匹配,如果匹配到了就invalid_referer字段值为0,否则设置该值为1。

location /photos/ {
  valid_referers none blocked www.baidu.com juejin.cn;
  if ($invalid_referer) {
    return  403;
  }
}

image.png

三、补充

HTTP中Origin和Referer的区别

HTTP 协议,用 Header 中的 Origin 和 Referer 来表示请求链接的来源,但他们在使用上有些区别。 1.Origin
Origin 指示了请求来自于哪个站点,只有服务器名,不包含路径信息,浏览器自动添加到http请求 Header 中,无需手动设置。

  • 同源请求:POST、OPTIONS、PUT、PATCH 和 DELETE请求都会添加Origin请求头,GET或HEAD请求不会添加Origin请求头。
  • 跨域请求:所有跨域请求(CORS)都会添加Origin请求头。 1.Referer
    Referer 指示了请求来自于哪个具体页面,包含服务器名和路径的详细URL,浏览器自动添加到http请求 Header 中,无需手动设置。
  • 来源页面采用 file 或 data URI 协议;
  • 来源页面采用 HTTPS 协议,而请求页面采用 HTTP 协议; 总结:
    referer显示来源页面的完整地址,而origin显示来源页面的origin: protocal+host,不包含路径等信息,也就不会包含含有用户信息的敏感内容 referer存在于所有请求,而origin只存在于post请求,随便在页面上点击一个链接将不会发送origin 因此origin较referer更安全,多用于防范CSRF攻击,但GET或HEAD请求不会添加Origin请求头,可以使用Referer补充防盗链。 参考:www.nginx.cn/doc/standar…