cookie作为辨别用户身份、进行Session跟踪而储存在用户本地终端上的数据(通常经过加密),存储格式如下:
Set-Cookie: NAME=VALUE(key1=value1&key2=value2);Expires=DATE;Path=PATH;Domain=DOMAIN_NAME;SECURE
通过设置cookie Domain 只能解决主域名相同的 跨子域名的跨域问题。例如将cookie的domain设置为.zlj.cn;name a.zlj.com b.zlj.cn等都能访问此cookie。
但是此法无法解决跨主域名的的问题。
CORS为我们提供了跨域资源共享的解决方案,通过Access-Control-Allow-Origin Access-Control-Allow-Credentials Access-Control-Allow-Headers Access-Control-Allow-Methods Access-Control-Expose-Headers Access-Control-Max-Age Access-Control-Request-Headers Access-Control-Request-Method Origin
Access-Control-Allow-Credentials 响应头表示是否可以将对请求的响应暴露给页面。返回true则可以,其他值均不可以。
Credentials可以是 cookies, authorization headers 或 TLS client certificates。
前端跨域传输cookie到服务端,需要三个条件:
在服务端,需要
response.addHeader("Access-Control-Allow-Origin", "demo.zhoulujun.cn");
response.addHeader("Access-Control-Allow-Credentials", "true");
前端ajax操作
$.ajax({ url : 'xxx', xhrFields: { withCredentials: true // 设置运行跨域操作 }}); //jquery
axios(url, {
method: 'GET',
mode: 'no-cors',
headers: {
'Access-Control-Allow-Origin': '*',
'Content-Type': 'application/json',
},
withCredentials: true,
credentials: 'same-origin',
}).then(response => {
})
这个比较麻烦,还是nginx代理比较方便
chrome80版本的声明
大致就是说80以后的版本,cookie默认不可跨域,除非服务器在响应头里再设置same-site属性。因为默认属性不再是lax
same-site有3种值可以设置:strict,lax,none
<a href="..."></a>
发送 Cookie发送 Cookie预加载<link rel="prerender" href="..."/>
发送 Cookie发送 CookieGET 表单<form method="GET" action="...">
发送 Cookie发送 CookiePOST 表单<form method="POST" action="...">
发送 Cookie不发送iframe<iframe src="..."></iframe>
发送 Cookie不发送AJAX$.get("...")
发送 Cookie不发送Image<img src="...">
发送 Cookie不发送如果只是host、端口转换,则cookie不会丢失。浏览器的cookie内有jsessionid。再次访问时,浏览器会发送当前的cookie。
如果路径也变化了,则需要设置cookie的路径转换,详细看了文档:http://nginx.org/en/docs/http/ngx_http_proxy_module.html?&_ga=1.161910972.1696054694.1422417685#proxy_cookie_path
location /proxy_path {
proxy_pass http://zhoulujun.cn/project;
proxy_cookie_path /project /proxy_path;
# proxy_cookie_domain b.zlj.com a.zlj.com;#如果cookie没有设置domain,无需配置(一般情况没有配置)
}
经过后端中转,基本可以解决所有问题,但是也带来多余的消耗
proxy_cookie_domain参数的作用是转换response的set-cookie header中的domain选项,由后端设置的域名domain转换成你的域名replacement,来保证cookie的顺利传递并写入到当前页面中,注意proxy_cookie_domain负责的只是处理response set-cookie头中的domain属性,仅此而已。
参考文章:
Cookie 的 SameSite 属性 www.ruanyifeng.com/blog/2019/09/cookie-samesite.html
转载本站文章《cookie跨域传输cookie问题:nginx跨域代理之proxy_cookie_domain》, 请注明出处:https://www.zhoulujun.cn/html/tools/webServer/nginx/2020_0526_8439.html
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。