在使用nginx进行请求转发时,由于各种需要,需要往后端在请求头中添加额外的请求头,或者在前端响应时添加后端没有返回的响应头信息。这些都可以在nginx中需要特定的指令来实现.同时,能够做到与业务无冲突.
本文涉及到的部分包括 添加请求头,添加响应头,以及达到ifAbsent的目的, 做到有则跳过,无则添加的目的.
本文参考的所有Nginx内置变量请参考 http://nginx.org/en/docs/varindex.html 此页.
添加请求头
指令: proxy_set_header
此指令可以在后端代理时,添加额外的请求头。此指令为set,即为直接设置,如果浏览器中带了请求头,这些的set同一个请求头,即会直接进行覆盖。最终效果就是同1个请求头,并不会设置2个.
参考:
proxy_set_header x-id "123";
添加响应头
指令: add_header, proxy_hide_header
add_header 的目的在于往浏览器中添加额外的响应头,即在原有代理响应中增加额外的头信息。此指令为add,即会直接添加,如果后端已经有同一响应头,这里的add,会再添加一个。即会出现浏览器会看到2个相同名字的响应头的问题.
处理此问题即使用 proxy_hide_header,即隐藏代理中指定的响应头.
需要注意的是 add_header 具有不同scope间覆盖的问题,即如果 Location中有add_header指令,则server或http中的所有add_header即无效,而不管是否是同一个headerName。 http://nginx.org/en/docs/http/ngx_http_headers_module.html 文中这样描述: There could be several add_header directives. These directives are inherited from the previous level if and only if there are no add_header directives defined on the current level.
通过指令组合,即可达到修改响应头的目的. 参考如下:
proxy_hide_header x-id; add_header x-id "123";
IfAbsent效果
在上面的例子中,并不达做到IfAbsent的目的。在请求头场景中,需要达到的效果为如果浏览器中传了 请求头,则nginx中不再添加, 如果没有传,则nginx中添加默认值,即达到默认请求头值的效果。而在响应头场景中,如果后端传了响应头,则nginx不再添加,如果没有,则添加响应头默认值,同样达到默认响应头的效果.
通过简单的伪代码可以理解为(以请求头为例)
var value = $browser_header_value if(value == null) value = 'defaultValue'; proxy_set_header x-id $value;
在nginx中,上述的if default逻辑,可以参考 map 指令来描述. map 指令请参考: http://nginx.org/en/docs/http/ngx_http_map_module.html
在上面的请求头场景中,指令变更为
map $http_x_id $req_x { default "8000"; ~.+ $http_x_id; } proxy_set_header x-id $req_x;
响应头场景中,指令变更为
map $upstream_http_x_id $res_x { default "1"; ~.+ $upstream_http_x_id; } proxy_hide_header x-id; add_header x-id $res_x;
其中 $http_* 表示读取浏览器中请求头值. $upstream_http_* 表示读取代理后端的响应头值. 上面的 ~.+ 即表示如果变量有值(任意值即可),就使用变量值,否则使用 default 的值.
转载请标明出处:i flym
本文地址:https://www.iflym.com/index.php/code/201908190001.html