Nginx rewrite将流量发送到IP地址,而不是URL
我已经将nginx设置为docker微服务的反向代理。有一个位置块将url从Nginx rewrite将流量发送到IP地址,而不是URL,nginx,nginx-reverse-proxy,Nginx,Nginx Reverse Proxy,我已经将nginx设置为docker微服务的反向代理。有一个位置块将url从/error重写为/right: server { listen 80 default_server; listen [::]:80 default_server ipv6only=on; server_name example.com; location /right { proxy_pass http://microse
/error
重写为/right
:
server {
listen 80 default_server;
listen [::]:80 default_server ipv6only=on;
server_name example.com;
location /right {
proxy_pass http://microservice_servers;
}
location /wrong {
rewrite ^/wrong/(\w+) /right/$1 redirect;
}
}
这样做的目的是从https://example.com/wrong/otherstuff
至https://example.com/right/otherstuff
。
但实际发生的是,它重写为http:///right/otherstuff
(一个可能的复杂因素是,我无法控制该站点的证书。这些证书由客户端控制,客户端将它们放在服务器前面的应用网关上。因此,我的nginx配置只处理端口80处的http流量,而不处理来自443的https。我不确定这是否真的相关,但以防万一,确实相关。)
我尝试了对重写块的各种更改,包括添加$server\u name
,将标志更改为last
(返回正确的内容,但不更改url),以及将标志更改为break
(不返回预期的内容)
知道这里发生了什么吗?默认情况下,您的
rewrite…redirect
语句将生成一个302响应,其中包含HTTP位置响应头中指定的完整URL
您可以使用curl-I来确认这一点https://example.com/wrong/otherstuff
Nginx根据原始请求填写协议和域名。此服务器
块通过http
接收请求,我们可以从您的问题推断主机头使用其IP地址
您需要在rewrite
语句中指定完整的URL:
rewrite ^/wrong/(\w+) https://example.com/right/$1 redirect;
或者,使用相对URL:
absolute_redirect off;
有关详细信息,请参阅。标题上写着“重写”,但规则是重定向?它使用带有
重定向标志的重写
指令:因此,在文档之后,接收到的URL被更改,放入302,并发送回客户端(这是处理HTTPS的应用网关)?假设应用网关处理302,并将新的URL发送回NGINX?因为这就是你在/对的中的结局。重写
本身不会导致NGINX在/right
内部重新启动。您可能需要将交换的消息发送到wireshark。