referer的写法是错的,正确的是referrer。大概是早期http规范的拼写错误,然后为了保持向下兼容,就将错就错了。
一、九种policy
enum ReferrerPolicy {
"",
"no-referrer",
"no-referrer-when-downgrade",
"same-origin",
"origin",
"strict-origin",
"origin-when-cross-origin",
"strict-origin-when-cross-origin",
"unsafe-url"
};
1 no-referrer
表示http请求的请求头没有referer字段
2 no-referrer-when-downgrade(默认值)
如果没指定其他policy,则这个就是浏览器的默认值。即当前的referer就是当前页面的地址(不包括锚点#)。
如果存在降级的情况,则referer不会被发送,也就是请求头没有referer字段,比如https->http的情况。
3 same-origin
如果请求是同源,即没有跨域,则referer字段会被发送。
如果请求存在跨域,则referer字段不会被发送。
4 origin
不管是否存在跨域或者降级的情况,referer字段都会被发送,但不会带上路径等信息,只有域名和端口。
比如页面地址是http://localhost:3000/referer.html,则referer则是http://localhost:3000/
5 strict-origin
在policy=origin的要求内,增加了在降级(https->http)的情况下,referer不会被发送。
6 origin-when-cross-origin
如果是同源的请求,则referer字段都会被发送,且referer的值是当前页面的地址(http://localhost:3000/referer.html)。
如果是跨域的请求,referer也会被发送,但此时referer的值只有域名+端口(http://localhost:3000/),也就是跟origin一样。
7 strict-origin-when-cross-origin
在policy=origin-when-cross-origin的要求内,增加了在降级(https->http)的情况下,referer不会被发送。
8 unsafe-url
不管是否同源或跨域,referer都会被发送。
9 空字符串
如果referer是空字符串,则会根据设定的算法回退到默认值,即no-referrer-when-downgrade
详情可参考:https://w3c.github.io/webapps...
二、referer什么时候不发送
在浏览器地址栏,直接输入或者点击标签的时候,referer就不会被发送。其他方式都会发送。
比如加载页面其他资源,如js,css和img等资源,又或者form表单,或者点击标签。
可通过js来获取referer的值:document.referrer。
但想通过js来改变http请求头的referer是不行的,虽然能改变document.referrer的值,但请求头的referer字段依然不会被改变。
delete window.document.referrer;
window.document.__defineGetter__('referrer', function () {
return "http://referer.com";
});
console.log(window.document.referrer) // http://referer.com
// 需要注意:此时http请求头的referer是没有被改变的
三、哪些html标签可设置referer的policy
1 meta
可通过meta来设置上面提到的九种policy
如:
2 a
可通过ref属性来设置。
如:xxx
3 img
可通过referrerPolicy属性来设置,如:
4 iframe
可通过referrerPolicy属性来设置,如:
上面几种方式,meta是网站级别的,相当于父级,一旦设置,html页面下的a和img等都会继承referer策略。
但可通过单独设置a和img等来实现不同的referer策略。
网上说貌似form表单也可以设置referer,但看了下w3c文档,貌似没有。
而link标签的referrerpolicy属性则属于实验阶段的API。referer
的写法是错的,正确的是referrer
。大概是早期http规范的拼写错误,然后为了保持向下兼容,就将错就错了。
一、九种policy
enum ReferrerPolicy {
"",
"no-referrer",
"no-referrer-when-downgrade",
"same-origin",
"origin",
"strict-origin",
"origin-when-cross-origin",
"strict-origin-when-cross-origin",
"unsafe-url"
};
1 no-referrer
表示http
请求的请求头没有referer
字段
2 no-referrer-when-downgrade(默认值)
如果没指定其他policy
,则这个就是浏览器的默认值。即当前的referer
就是当前页面的地址(不包括锚点#)。
如果存在降级的情况,则referer
不会被发送,也就是请求头没有referer
字段,比如https->http
的情况。
3 same-origin
如果请求是同源,即没有跨域,则referer
字段会被发送。
如果请求存在跨域,则referer
字段不会被发送。
4 origin
不管是否存在跨域或者降级的情况,referer
字段都会被发送,但不会带上路径等信息,只有域名和端口。
比如页面地址是http://localhost:3000/referer.html
,则referer
则是http://localhost:3000/
5 strict-origin
在policy=origin
的要求内,增加了在降级(https->http
)的情况下,referer
不会被发送。
6 origin-when-cross-origin
如果是同源的请求,则referer
字段都会被发送,且referer
的值是当前页面的地址(http://localhost:3000/referer.html
)。
如果是跨域的请求,referer
也会被发送,但此时referer
的值只有域名+端口(http://localhost:3000/
),也就是跟origin
一样。
7 strict-origin-when-cross-origin
在policy=origin-when-cross-origin
的要求内,增加了在降级(https->http
)的情况下,referer
不会被发送。
8 unsafe-url
不管是否同源或跨域,referer
都会被发送。
9 空字符串
如果referer
是空字符串,则会根据设定的算法回退到默认值,即no-referrer-when-downgrade
详情可参考: https://w3c.github.io/webappsec-referrer-policy/
二、referer什么时候不发送
在浏览器地址栏,直接输入或者点击标签的时候,referer
就不会被发送。其他方式都会发送。
比如加载页面其他资源,如js
,css
和img
等资源,又或者form
表单,或者点击标签。
可通过js来获取referer
的值:document.referrer
。
但想通过js
来改变http
请求头的referer
是不行的,虽然能改变document.referrer
的值,但请求头的referer
字段依然不会被改变。
delete window.document.referrer;
window.document.__defineGetter__('referrer', function () {
return "http://referer.com";
});
console.log(window.document.referrer) // http://referer.com
// 需要注意:此时http请求头的referer是没有被改变的
三、哪些html标签可设置referer的policy
1 meta
可通过meta
来设置上面提到的九种policy
如:
2 a
可通过ref
属性来设置。
如:xxx
3 img
可通过referrerPolicy
属性来设置,如:
4 iframe
可通过referrerPolicy
属性来设置,如:
上面几种方式,meta
是网站级别的,相当于父级,一旦设置,html
页面下的a
和img
等都会继承referer
策略。
但可通过单独设置a
和img
等来实现不同的referer
策略。
网上说貌似form
表单也可以设置referer
,但看了下 w3c文档,貌似没有。
而link标签的referrerpolicy属性则属于实验阶段的API。