Nginx 反向代理 - 修改自定义标头值(如果存在)

Nginx 反向代理 - 修改自定义标头值(如果存在)

我正在尝试在反向代理的不同位置后面添加不同的应用程序。

我知道proxy_redirect修改LocationRefresh标题的指令,但我还需要修改自定义标题,比如X-Ajax-Redirect

我也尝试使用该map指令,但由于该指令甚至高于服务器级别,因此它不适用于不同位置。我需要类似sub_filter适用于标头的指令。

我当前的配置:

worker_processes auto;

events { worker_connections 1024; }

http {

    sendfile on;

    upstream docker-firstapp{
        server firstapp:8080;
    }

    upstream docker-secondapp{
        server secondapp:8080;
    }

    server {
        listen 80;

        location /myFirstApp/ {
            proxy_pass         http://docker-firstapp/;
            proxy_redirect     / /myFirstApp/;
            proxy_set_header   Host $host;
            proxy_set_header   X-Real-IP $remote_addr;
            proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header   X-Forwarded-Host $server_name;

            sub_filter_once off;
            sub_filter ' href="/' ' href="/myFirstApp/';
            sub_filter ' src="/' ' src="/myFirstApp/';
            sub_filter ' action="/' ' action="/myFirstApp/';

            # sub_filter 'X-Ajax-Redirect: /' 'X-Ajax-Redirect: /myFirstApp/';
        }

        location /mySecondApp/ {
            proxy_pass         http://docker-secondapp/;
            proxy_redirect     / /mySecondApp/;
            proxy_set_header   Host $host;
            proxy_set_header   X-Real-IP $remote_addr;
            proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header   X-Forwarded-Host $server_name;

            sub_filter_once off;
            sub_filter ' href="/' ' href="/mySecondApp/';
            sub_filter ' src="/' ' src="/mySecondApp/';
            sub_filter ' action="/' ' action="/mySecondApp/';

            # sub_filter 'X-Ajax-Redirect: /' 'X-Ajax-Redirect: /mySecondApp/';
        }
    }
}

关于如何完成我的需要有什么想法吗?

答案1

代理服务器接受你为其设置的标头,并使用其自己的标头返回响应

我不知道你是否想

  • 发送代理的特定标头 {server > proxy}

或者

  • 在向客户端宣布之前过滤代理响应 {服务器 > 客户端}

假设我们两者都需要


如果服务器正在与代理通信:你会使用proxy_set_header

你可以设置你想要的标题并发送给代理

set $my_header "/myFirstApp/$x_ajax_redirect";
proxy_set_header X-Ajax-Redirect $my_header

可能重复更改 nginx 反向代理中的主机头


如果服务器正在与客户端通信: nginx 可以使用以下方式添加标头添加标题指示

但它有两个局限性

  1. 它不进行修改,意味着它只添加标题。因此它可能会重复并与 nginx 或浏览器发生冲突
  2. 受限标头:意味着它仅适用于 nginx 知道的标头

替代标头-更多-nginx-模块

它允许替换、清除默认的 nginx 标头并设置默认或风俗标题

指令将如下所示more_set_headers 'X-Ajax-Redirect: ...';

文档指的是一些局限性但没问题,因为它可以与add_header

唯一真正的限制是它不是 nginx 主线的一部分,因此你需要将其编译到 nginx 中

安装

  1. 获取 nginx 源代码
  2. 从其下载模块文件列表
  3. 使用模块从源代码构建 nginx
# download nginx source code
wget 'http://nginx.org/download/nginx-x.xx.x.tar.gz'
tar -xzvf nginx-x.xx.x.tar.gz
cd nginx-x.x.x/

# nginx installation dir: /opt/nginx/
# assuming you downdoaded the module
./configure --prefix=/opt/nginx \
    --add-module=/path/to/headers-more-nginx-module

# build nginx
make
make install

使用docker? 你可以找到一些编译了此模块的 nginx 容器,例如macbre/nginx-http3

我不会推荐这个容器,因为它是为实验性的 http3 功能而构建的

最好从源代码构建或将模块作为动态模块加载

相关内容