5

我想实现以下目标:

请求主机:

http://example.com.proxy.myserver.com

应该改写为

http://example.com

并通过 nginx proxypass 传递给 squid 服务器。

server {
  listen 80;
  server_name ~^(?<subdub>.*)\.proxy\.myserver\.com$;
  location / {
    rewrite ^ $scheme://$subdub break;
    proxy_set_header  X-Real-IP $remote_addr;
    proxy_set_header  Host $scheme://$subdub;
    proxy_set_header  Request-URI $scheme://$subdub;
    proxy_pass http://localhost:3128;
    proxy_redirect off;
  }
}

问题是,nginx 立即将此请求重定向到http://example.com

任何想法如何让这个工作?

4

1 回答 1

1

301 重定向正是 nginx 对该重写规则所做的:因为您将 $scheme://$subdub 放在替换部分,nginx 将执行 301,忽略那个“break”标志。

如果替换字符串以 http:// 开头,则客户端将被重定向,并且任何进一步的重写指令都将终止。

您是要“重写”还是“重定向”?如果只是为了重写,您可以删除该重写指令:

    rewrite ^ $scheme://$subdub break;

它会起作用,因为您的上游服务器可以依靠 HOST 标头来确定流量目标(虚拟主机)。

此外,您发送到上游服务器的主机标头也是错误的。它应该是

    proxy_set_header  Host $subdub;

$scheme 不应放在 Host 标头中。

于 2013-03-29T04:03:15.843 回答