我正在尝试在反向代理的不同位置后面添加不同的应用程序。
我知道proxy_redirect
修改Location
和Refresh
标题的指令,但我还需要修改自定义标题,比如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 或浏览器发生冲突
- 受限标头:意味着它仅适用于 nginx 知道的标头
它允许替换、清除默认的 nginx 标头并设置默认或风俗标题
指令将如下所示more_set_headers 'X-Ajax-Redirect: ...';
文档指的是一些局限性但没问题,因为它可以与add_header
唯一真正的限制是它不是 nginx 主线的一部分,因此你需要将其编译到 nginx 中
安装
- 获取 nginx 源代码
- 从其下载模块文件列表
- 使用模块从源代码构建 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 功能而构建的
最好从源代码构建或将模块作为动态模块加载