nginx proxy_reverse 没有设置从上游服务器到客户端浏览器的 cookie
nginx proxy_reverse not setting cookie from upstream server to the client browser
我有一个 expressjs 服务器来验证来自 svelte 内置前端应用程序的登录请求。
前端应用程序 运行ning frontenddomain.com,expressjs 服务器 运行ning backenddomain.com
这是我的登录 post 验证和设置 cookie 的路由:
app.post('/login', (req, res)=>{
// check db,find the user, write a jwt token and put it in a cookie to send it to the
// browser
res.cookie("accesstoken", accessToken)
res.cookie("refreshtoken", refreshtoken)
res.send(...)
}
此服务器代码部署到 ubuntu 服务器,Nginx 运行ning 作为 proxy_reverse,这是我的 nginx 块配置:
server {
...
location / {
proxy_pass http://localhost:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
proxy_cookie_domain localhost .frontenddomain.com;
proxy_cookie_domain ~^(.+)(Domain=frontenddomain.com)(.+)$ "
Domain=.frontenddomain.com ";
}
}
server {
listen 80;
listen [::]:80;
server_name backenddomain.com www.backenddomain.com;
root /var/www/backenddomain.com;
index index.html;
location / {
try_files $uri $uri/ /index.html;
}
}
当我 运行 服务器和 svelte 应用程序(前端应用程序)使用我的本地机器时,一切正常(客户提供凭证,cookie 被发送到客户端浏览器并在检查 google 开发工具时,我确认已在客户端浏览器中正确设置cookies)
当我将我的 expressjs 服务器部署到 ubuntu (20.04) 并使用 pm2 到 运行 我的服务器时,它确实启动了,我可以查看我所有的 console.log。我的前端应用程序 运行s 和我转到我的登录页面,输入凭据并单击提交,该应用程序让我登录(因为凭据是正确的并且用户在前端应用程序本地存储上设置为 true)但是没有设置 COOKIES浏览器。
我阅读了 nginx 文档,我从不同的站点阅读了 material 和 posts 关于如何设置 Nginx proxy_reverse cookie 域但无法解决问题(问题是cookies 没有在浏览器中设置,服务器发出它们)但我的代理服务器没有将它们传递给浏览器。
这些关于 proxy_reverse 和 cookie 的问题出现了,poster 卷土重来,post 对他们自己的问题的回答含糊不清,没有其他答案。似乎没有足够的技术人员了解这个问题。
我的位置代码有 proxy_cookie_domain localhost .frontenddomain.com;
如何设置 nginx proxy_reverse 将 cookie 设置为从上游服务器传递给浏览器?
所以它与 nginx 块配置无关,但它是 cookie 设置。要使跨站点 cookie 起作用,必须使用 sameSite : none (或严格)和安全标志进行设置。确保您的后端和前端必须使用域(在撰写本文时的最新草案中不允许使用 ip)
您还需要使用 ssl 保护前域和后域 (https)。
您在 nginx 上的 ufw 需要允许 https。
Cookie 设置:
res.cookie("name", "value", { sameSite: "none", secure : true })
在更新服务器和您的 nginx conf 站点可用后重新启动您的 nginx
它应该可以工作。
我有一个 expressjs 服务器来验证来自 svelte 内置前端应用程序的登录请求。 前端应用程序 运行ning frontenddomain.com,expressjs 服务器 运行ning backenddomain.com
这是我的登录 post 验证和设置 cookie 的路由:
app.post('/login', (req, res)=>{
// check db,find the user, write a jwt token and put it in a cookie to send it to the
// browser
res.cookie("accesstoken", accessToken)
res.cookie("refreshtoken", refreshtoken)
res.send(...)
}
此服务器代码部署到 ubuntu 服务器,Nginx 运行ning 作为 proxy_reverse,这是我的 nginx 块配置:
server {
...
location / {
proxy_pass http://localhost:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
proxy_cookie_domain localhost .frontenddomain.com;
proxy_cookie_domain ~^(.+)(Domain=frontenddomain.com)(.+)$ "
Domain=.frontenddomain.com ";
}
}
server {
listen 80;
listen [::]:80;
server_name backenddomain.com www.backenddomain.com;
root /var/www/backenddomain.com;
index index.html;
location / {
try_files $uri $uri/ /index.html;
}
}
当我 运行 服务器和 svelte 应用程序(前端应用程序)使用我的本地机器时,一切正常(客户提供凭证,cookie 被发送到客户端浏览器并在检查 google 开发工具时,我确认已在客户端浏览器中正确设置cookies)
当我将我的 expressjs 服务器部署到 ubuntu (20.04) 并使用 pm2 到 运行 我的服务器时,它确实启动了,我可以查看我所有的 console.log。我的前端应用程序 运行s 和我转到我的登录页面,输入凭据并单击提交,该应用程序让我登录(因为凭据是正确的并且用户在前端应用程序本地存储上设置为 true)但是没有设置 COOKIES浏览器。
我阅读了 nginx 文档,我从不同的站点阅读了 material 和 posts 关于如何设置 Nginx proxy_reverse cookie 域但无法解决问题(问题是cookies 没有在浏览器中设置,服务器发出它们)但我的代理服务器没有将它们传递给浏览器。
这些关于 proxy_reverse 和 cookie 的问题出现了,poster 卷土重来,post 对他们自己的问题的回答含糊不清,没有其他答案。似乎没有足够的技术人员了解这个问题。
我的位置代码有 proxy_cookie_domain localhost .frontenddomain.com;
如何设置 nginx proxy_reverse 将 cookie 设置为从上游服务器传递给浏览器?
所以它与 nginx 块配置无关,但它是 cookie 设置。要使跨站点 cookie 起作用,必须使用 sameSite : none (或严格)和安全标志进行设置。确保您的后端和前端必须使用域(在撰写本文时的最新草案中不允许使用 ip)
您还需要使用 ssl 保护前域和后域 (https)。
您在 nginx 上的 ufw 需要允许 https。
Cookie 设置:
res.cookie("name", "value", { sameSite: "none", secure : true })
在更新服务器和您的 nginx conf 站点可用后重新启动您的 nginx 它应该可以工作。