Nginx rewrite将流量发送到IP地址,而不是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

我已经将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://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。