一、http请求中的Referrer-Policy策略及应用
在页面调用图片等其它资源时,或者发生页面跳转时,都会向服务端发生一个带Referrer的HTTP请求,这也是一些网站做防盗链的抓手,在Referrer Policy策略发面前,浏览器可以按自己的默认规则来决定是否加上Referrer。2014年W3C下Web应用安全工作组(Web Application Security Working Group)发布了Referrer Policy草案,对浏览器发送Referrer做了详细规定。在新的Referrer Policy中,可以实现隐藏Referrer,也可以只发送来源URL的host地址(不过不允许伪造)。
1. 各种Referrer-Policy策略介绍
新的Referrer Policy规定了五种Referrer策略Referrer Policy States如下:
No Referrer策略
属性值:no-referrer
意义:任何情况下都不发送 Referrer 信息。
No Referrer When Downgrade策略
属性值:no-referrer-when-downgrade
意义 :仅当发生协议降级时不发送Referrer信息(如 HTTPS 页面引入 HTTP 资源,从 HTTPS 页面跳到 HTTP 等)时不发送 Referrer信息。这个规则是现在大部分浏览器默认所采用的。
Origin Only策略
属性值:origin
意义:发送只包含host部分的 Referrer。启用这个规则,无论是否发生协议降级,无论是本站链接还是站外链接,都会发送 Referrer信息,但是只包含协议+host部分(不包含具体的路径及参数等信息)。
Origin When Cross-origin策略
属性值:origin-when-crossorigin
意义:仅在发生跨域访问时发送只包含host的Referrer,同域下还是完整的。它与Origin Only的区别是多判断了是否Cross-origin。需要注意的是协议、域名和端口都一致,才会被浏览器认为是同域;
Unsafe URL策略
属性值:unsafe-url
意义:无论是否发生协议降级,无论是本站链接还是站外链接,统统都发送 Referrer 信息。正如其名,这是最宽松而最不安全的策略;
2. 策略的应用方法
怎么应用上面的Referrer策略呢?主要有两种方法,一种是在服务端使用响应头信息控制,一种是使用页面中meta标签属性控制。
1.服务端对Referrer的控制,以Nginx为例。直接在Nginx的响应上增加定义该Referrer-Policy响应头信息即可:
#nginx中增加对Referrer的控制 add_header Referrer-Policy "origin-when-crossorigin"; add_header 'Referrer-Policy' 'origin'; add_header 'Referrer-Policy' 'unsafe-url';
2.可以在页面中meta标签属性控制
#的html响应元素中控制 <meta name="referrer" content="no-referrer"> <meta name="referrer" content="no-referrer-when-downgrade"> <meta name="referrer" content="origin">
另外对链接<a>标签的,也可以单独设置其referrer属性来指定Referrer策略,单个链接设置的策略优先级最高。且只能作用在这个链接上。并且<a>标签可用的Referrer策略只有三种:不传、只传host和都传。如:<a href="#url" referrer="no-referrer|origin|unsafe-url">...</a>
二、Nfs动态添加扩展服务器以及共享目录的操作及nfs平滑重启
线上服务器上已经有一套nfs服务,但后来发现不够,还需要另外一个目录进行共享,另外因业务需要添加了几台服务器,因此即涉及到nfs服务器的扩展,又涉及到nfs服务共享目录的扩展。
nfs可以支持共享多个目录,只需要在配置文件中重新启一行填写配置即可,如下:
user@n192-25:~$ vim /etc/exports # /etc/exports: the access control list for filesystems which may be exported # to NFS clients. See exports(5). # # Example for NFSv2 and NFSv3: # /srv/homes hostname1(rw,sync,no_subtree_check) hostname2(ro,sync,no_subtree_check) # # Example for NFSv4: # /srv/nfs4 gss/krb5i(rw,sync,fsid=0,crossmnt,no_subtree_check) # /srv/nfs4/homes gss/krb5i(rw,sync,no_subtree_check) #共享目录1 /opt/data/share/files 192.168.26.27(rw,sync,no_root_squash,no_subtree_check) 192.168.26.35(rw,sync,no_root_squash,no_subtree_check) #共享目录2 /opt/data/share/private 192.168.26.27(rw,sync,no_root_squash,no_subtree_check) 192.168.26.35(rw,sync,no_root_squash,no_subtree_check)
nfs配置修改之后,需要对nfs进行重启或者更新配置,nfs可涉及的命令有force-reload/reload/restart/start/status/stop,其中reload, force-reload可以对nfs进行平滑重启。
线上服务,不过在进行reload之后立即查看当下服务器mount挂载的明细会看不到变化的,因为需要先到其它的客户端机器上进行mount命令挂载,然后就可以查看到变化。
user@n192-25:/opt/www-data/oemu.bytedance.com$ service nfs-kernel-server ### force-reload reload restart start status stop user@n192-25:~$ sudo service nfs-kernel-server reload user@n192-25:~$ mount 192.168.26.27:/opt/data/share/files /opt/data/share/files user@n192-25:~$ /sbin/showmount -a All mount points on n147-026-025: 192.168.26.27:/opt/data/share/private 192.168.26.27:/opt/data/share/files 192.168.26.35:/opt/data/share/private 192.168.26.35:/opt/data/share/files 192.168.26.39:/opt/data/share/private 192.168.26.39:/opt/data/share/files 192.168.26.101:/opt/data/share/private 192.168.26.101:/opt/data/share/files