有一个需求需要统一账号的登录,但是第三方应用的原生的登录界面登录以后,会被公司的前端检测没有登录的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里哪部分