Nginx如何在URI中保留主机名并执行Rewrite,动态传递请求主机名
Nginx配置:动态传递请求主机名并保留URI重写
要实现无需硬编码主机名、原样传递请求主机名,同时完成指定的URI重写,你可以利用Nginx内置变量动态拼接代理地址,以下是完整的配置方案:
location /app1/ { proxy_set_header X-Forwarded-Server $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 传递原始Host头给后端服务 proxy_set_header Host $http_host; # 重写URI,移除/app1前缀 rewrite ^/app1/(.*)$ /$1 break; # 动态生成代理地址,自动匹配请求的协议和主机名 proxy_pass $scheme://$http_host; }
关键细节说明:
- $scheme:自动获取当前请求的协议(http/https),避免硬编码协议类型
- $http_host:直接读取请求头中的
Host值,包含原始主机名和端口(如果请求带了非标准端口),完全实现“原样传递”的需求 - proxy_set_header Host $http_host:确保后端服务收到的
Host头与原始请求一致,避免后端依赖Host头的功能(比如多站点区分)出现异常 - rewrite规则:用
^锚定路径开头,精准匹配/app1/前缀的请求,重写后移除该前缀,break标记让Nginx停止后续重写处理,直接使用重写后的URI发起代理请求
额外注意:
- 若你不需要保留端口,或希望使用Nginx服务器配置的主机名,可将
$http_host替换为$host,但$http_host更贴合“原样传递请求主机名”的需求 - 确保Nginx已启用
ngx_http_proxy_module模块(默认安装一般已包含) - 若处理HTTPS请求,需提前配置好SSL证书及相关SSL参数,否则
$scheme会识别为http,导致代理错误
内容的提问来源于stack exchange,提问作者Sairam
相关产品推荐
相关产品推荐

