我遇到了一个奇怪的问题,我不确定这是一个configuration问题还是nginx中的一个错误。 我的设置是一个具有Apache2后端服务器的nginx反向代理。 负载平衡器非常基本,类似于wiki的例子 ,例如简化:
http { upstream myproject { server 127.0.0.1:8000; } server { listen 80; location / { proxy_pass http://myproject; } } }
现在,当我尝试在Apache中请求一个目录时,出现了一个问题,例如在URL末尾没有结尾的斜线。 例如,客户端请求:
http://apache.myserver.com/somedirectory
Apache将回复一个HTTP 302redirect客户端
http://apache.myserver.com/somedirectory/
请注意,最后注意到它是一个目录的url有一个斜线。 还要注意,通过在redirect头中使用传入的请求主机名,Apache是“聪明的”。 迄今为止都很好。 但是,当使用nginx进行负载均衡时,会将301发送到客户端,而不会将nginx上游名称转换回实际的服务器/域。 所以客户将收到以下内容:
GET http://nginx.myserver.com/somedirectory HTTP 301 Moved Permanently ... Location: http://myproject:8000/somedirectory/
myproject是nginx上游后端的名称。 它不是客户可以解决的实际主机。 在我看来,客户应该被redirect到
http://nginx.myserver.com/somedirectory/
即上游后端的名称应该在响应头中被replace。 这是一个在Nginx的错误,或者我做错了什么?
原来nginx有相当多的代理redirect选项来处理这类问题。 我结束了使用这样的东西:
location / { proxy_pass http://myproject; proxy_set_header Host myproject; proxy_redirect http://myproject/ $scheme://$host/; proxy_redirect http://myproject:8000/ $scheme://$host/; }
这基本上用$ hostreplace上游名称,并删除端口。 这工作在我的情况,因为我在HTTP / HTTPS的默认端口托pipenginx。 如果nginx运行在非默认端口上,需要这样的东西:
proxy_redirect http://myproject/ $scheme://$host:$server_port/; proxy_redirect http://myproject:8000/ $scheme://$host:$server_port/;
尝试使用server_name_in_redirect像这样:
server_name_in_redirect off;
如果这不起作用,你可能需要用proxy_redirect做一些事情,尽pipe听起来你的后端行为是正确的。