如题,百度能解决问题的帖子暂时没发现。后转战谷歌,看到一个解决别的问题的帖子,从中受到了启发,醍醐灌顶后问题终得以解决。
实际需求的情况是:公司做一个中心化平台,需要对接很多第三方中间件系统,其中有一个点是需要控制各个子平台的Cookie信息(内部运维使用,不对互联网开放,所以想去除HttpOnly限制)。
- 各个平台埋入一个 html 文件,通过里面的 js 脚本读取和修改对应第三方系统的 cookie 信息。
- 一些第三方系统对 Cookie 设置了 HttpOnly,通过 js 是无法读取和修改的。
- 所有的接入系统,都通过平台的一个 nginx 进行了管理。
于是乎,萌生了一个方案:
既然所有平台都由统一的 nginx 管理,那么直接在 nginx 里,把 HttpOnly 给干掉不就行了?
针对此方案,变通的方法是使用 nginx 的 map 映射变量法来重新设置 Cookie 的值(说出来挺抽象的,下面直接看代码便一清二楚了)
# 删除Cookie中的HttpOnly
map $sent_http_set_cookie $resp_cookie {
~*(?<CK>.+)HttpOnly $CK;
}
server {
listen 80;
server_name *.test.com;
location / {
add_header Set-Cookie $resp_cookie;
proxy_pass http://xxxxx;
}
}
- 按照Cookie规范,HttpOnly是最后一个字符串,所以通过在 map 中使用正则表达式提取除 HttpOnly 之前的值,然后使用 add_header 复写到 Cookie 中。
- $sent_http_set_cookie 为 nginx 内置变量,还有很多其他 $send_http 开头的变量表示响应内容中的相关信息。
- 处理 Cookie 的 Secure 也是一样(本文略)
通过本文内容可以发现,其实这个方法并不是 nginx 专门为 HttpOnly 设置的方案,我认为这个方法可以解决很多类似的问题。除本文之外的其他需求有时候也可以通过这样的正则提取替换法来实现。
(END)