在nginx中通过map指令来正确添加请求头或修改头

在使用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

相关文章:

作者: flym

I am flym,the master of the site:)

发表评论

邮箱地址不会被公开。 必填项已用*标注