nginx 在请求头request中增加header参数

nginx 在请求头request中增加header参数,第1张

有两种方式可以实现这一 *** 作:

1:nginx反向代理(需要两个nginx服务

在nginx反向代理服务器通过使用proxy_set_header实现。

      e.    proxy_set_header X-Forwarded-For 127.0.0.1

2:安装模块Passenger

      [Passenger用户手册] https://github.com/biti/passenger-doc-zh/wiki/Passenger%E7%94%A8%E6%88%B7%E6%89%8B%E5%86%8Cnginx%E7%89%88

      安装完成后使用:

      passenger_set_cgi_param HTTP_X_FORWARDED_FOR 127.0.0.1 

      来增加请求header中的参数

应用场景:

1. 切流,一个线上服务,新增了一个功能,需要公网内部测试,这时候可以根据来源ip &path设置不同的header信息,配合业务逻辑实现内外网流量切分,保证内测功能只有内网可见。

2. 使用非标准标头向上游服务器通知用户的IP地址和其他请求属性

1. 最简反向代理配置

在http节点下,使用upstream配置服务地址,使用server的location配置代理映射。

upstream my_server {

server 10.0.0.2:8080

keepalive 2000

}

server {

listen 80

server_name 10.0.0.1

client_max_body_size 1024M

location /my/ {

proxy_pass http://my_server/

proxy_set_header Host $host:$server_port

}

}

通过该配置,访问nginx地址http://10.0.0.1:80/my的请求会被转发到my_server服务地址http://10.0.0.2:8080/。

需要注意的是,如果按照如下配置:

upstream my_server {

server 10.0.0.2:8080

keepalive 2000

}

server {

listen 80

server_name 10.0.0.1

client_max_body_size 1024M

location /my/ {

proxy_pass http://my_server

proxy_set_header Host $host:$server_port

}

}

那么,访问nginx地址http://10.0.0.1:80/my的请求会被转发到my_server服务地址http://10.0.0.2:8080/my。这是因为proxy_pass参数中如果不包含url的路径,则会将location的pattern识别的路径作为绝对路径。

2. 重定向报文代理

即便配置了nginx代理,当服务返回重定向报文时(http code为301或302),会将重定向的目标url地址放入http response报文的header的location字段内。用户浏览器收到重定向报文时,会解析出该字段并作跳转。此时新的请求报文将直接发送给服务地址,而非nginx地址。为了能让nginx拦截此类请求,必须修改重定向报文的location信息。

location /my/ {

proxy_pass http://my_server

proxy_set_header Host $host:$server_port

proxy_redirect / /my/

}

使用proxy_redirect可以修改重定向报文的location字段,例子中会将所有的根路径下的url代理到nginx的/my/路径下返回给用户。比如服务返回的重定向报文的location原始值为/login,那么经过nginx代理后,用户收到的报文的location字段为/my/login。此时,浏览器将会跳转到nginx的/my/login地址进行访问。

需要注意的是,服务返回的重定向报文的location字段有时会填写绝对路径(包含服务的ip/域名和端口),有时候会填写相对路径,此时需要根据实际情况进行甄别。

location /my/ {

proxy_pass http://my_server

proxy_set_header Host $host:$server_port

proxy_redirect http://my_server/ http://$host:$server_port/my/

}

上述配置便是将my_server服务的根路径下的所有路径代理到nginx地址的/my/路径下。当nginx配置只有一个server时,http://$host:$server_port前缀可以省略。

3. 报文数据替换

使用nginx代理最牛(dan)逼(sui)的情况就是http响应报文内写死了服务地址或web绝对路径。写死服务地址的情况比较少见,但也偶尔存在。最棘手的是写死了web绝对路径,尤其是绝对路径都没有公共前缀。举个例子来说:

一般的web页面会包含如下类似路径:

/public:用于静态页面资源,如js脚本/public/js,样式表/public/css,图片/public/img等。

/static:和/public类似。

/api:用于后台服务API接口。

/login:用于登录验证。

其他。

对于这样的服务,可能的代理配置如下:

location /my/ {

proxy_pass http://my_server/

proxy_set_header Host $host:$server_port

proxy_redirect / /my/

}

location /login/ {

proxy_pass http://my_server/public

proxy_set_header Host $host:$server_port

}

location /public/ {

proxy_pass http://my_server/public

proxy_set_header Host $host:$server_port

}

location /api/ {

proxy_pass http://my_server/api

proxy_set_header Host $host:$server_port

}

由于web页面或静态资源内写死了类似的绝对路径,那么对于用户来说,通过页面内的链接进行跳转时,都会请求到nginx服务对应的路径上。一旦存在另一个服务也包含类似的路径,也需要nginx进行代理,那么矛盾就出现了:访问nginx的同一个路径下的请求究竟转发给哪一个服务?

要解决这个问题,必须在用户收到报文前,将报文的数据中包含的绝对路径都添加统一的前缀,如/my/public,/my/api,/my/login,这样nginx代理配置则可以简化为:

location /my/ {

proxy_pass http://my_server/

proxy_set_header Host $host:$server_port

proxy_redirect / /my/

}

location /other/ {

proxy_pass http://other_server/

proxy_set_header Host $host:$server_port

proxy_redirect / /other/

}

nginx的ngx_http_sub_module模块提供了类似的报文数据替换功能,该模块默认不会安装,需要在编译nginx时添加--with-http_sub_module参数,或者直接下载nginx的rpm包。

使用sub_filter对数据包进行替换的语法如下:

location /my/ {

proxy_pass http://my_server/

proxy_set_header Host $host:$server_port

sub_filter 'href="/' 'href="/my/'

sub_filter 'src="/' 'src="/my/'

sub_filter_types text/html

sub_filter_once off

}

上述配置会将/my/下的所有响应报文内容的href="/替换为href="/my,以及src="/替换为src="/my,即为所有的绝对路径添加公共前缀。

注意,如果需要配置多个sub_filter,必须保证nginx是1.9.4版本之上的。

a.com的所有前缀为api的请求都需要转发到b.com,配置如下:

//  a.com 的静态Web文件路径及端口号配置

server {

listen       80

server_name  localhost

#charset koi8-r

#access_log  logs/host.access.log  main

location / {

root html/dist// a.com 的静态Web文件路径

index index.html

}

// 所有a.com/api/*的请求,都需要转发到 b.com/*

//拦截所有 “ /api ”前缀的请求,转发到 “ b.com”

location ^~/api{

proxy_pass b.com

proxy_set_header HOST $host

proxy_set_header X-Real-IP $remote_addr

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for

}

}


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/bake/11597113.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-17
下一篇2023-05-17

发表评论

登录后才能评论

评论列表(0条)

    保存