将nginx主机和proxypass重写为squid

时间:2013-03-29 03:32:21

标签: nginx rewrite squid proxypass

我想实现以下目标:

请求主持人:

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

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

1 个答案:

答案 0 :(得分:1)

301重定向正是nginx应该对重写规则做的事情:因为你将$ scheme:// $ subdub放在替换部分,nginx将执行301,忽略该“break”标记。

  

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

您是在尝试“重写”还是“重定向”?如果它只是用于重写,则可以删除该重写指令:

    rewrite ^ $scheme://$subdub break;

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

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

    proxy_set_header  Host $subdub;

$ scheme不应该放在Host标头中。