有一个需求需要统一账号的登录,但是第三方应用的原生的登录界面登录以后,会被公司的前端检测没有登录的cookie拦截而跳转到公司自己的登录页面,因为是原生页面,所以只好后端处理这个cookie。由于不想在后台的java代码中增加相应的处理,所以在nginx上面打主意。
现有的nginx的配置如下,有一个/login,有一个*.html。
#/login路径跳转到 /login.html中
location ^~/login {
rewrite ^(.*)$ /$1.html last;
}
#处理.html的路径
location ~ \.(html)$ {
proxy_set_header Host $http_host;
add_header Cache-Control "no-cache, no-store, max-age=0, must-revalidate";
add_header Pragma no-cache;
....省略部分代码.....
}
增加cookie的代码是
add_header Set-Cookie "cookieName=1; Domain=.xxx.com; Path=/" always;
首先我把这段代码给加到了 /login 的处理中,如下代码段中,但是没有成功,因为这里处理是rewrite,rewrite是实现URL重写的关键指令,不会带cookie,所以代码不能放在这里。
location ^~/login {
add_header Set-Cookie "cookieName=1; Domain=.xxx.com; Path=/" always;
rewrite ^(.*)$ /$1.html last;
}
然后就只能放到对\.(html) 路径的处理段中了。这时就要对路径进行匹配了,我想对login.html的路径进行匹配,然后只有访问这个路径时增加一个cookie。先把实现放出来。
location ~ \.(html)$ {
proxy_set_header Host $http_host;
add_header Cache-Control "no-cache, no-store, max-age=0, must-revalidate";
add_header Pragma no-cache;
#判断路径包含 /login 时进行特殊处理
if ($request_uri ~* "/login") {
# 在根域 .xxx.com的/路径上面,增加cookieName的cookie,值为1
add_header Set-Cookie "cookieName=1; Domain=.xxx.com; Path=/" always;
}
}
这里的$request_uri 变量,指的是完整的请求路径中去掉域名$host剩下的部分,如http://www.shutdown.cn/login/login.do 的这个地址,$request_uri就是 /login/login.do。
if ($request_uri ~* "^/$") 表示url中只有域名,后面不跟任何东西,比如www.shutdown.cn。
if ($request_uri ~* "/login") 表示域名后面那串儿只要包含/login这个关键词,就可匹配成功。比如http://www.shutdown.cn/login.html
参考文档 nginx配置文件中$request_uri到底是指的url里哪部分
本文介绍如何在Nginx中针对特定路径设置Cookie,解决因原生登录界面导致的前端登录状态验证问题。通过使用if条件判断请求路径是否包含/login,并在此条件下设置Cookie。
7149

被折叠的 条评论
为什么被折叠?



