我遇到了一个奇怪的问题,我不确定它是配置问题还是Nginx中的错误.我的设置是一个Nginx反向代理,它有Apache2后端服务器.负载平衡器非常基本类似于example from the 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 302进行回复以将客户端重定向到
http://apache.myserver.com/somedirectory/
注意,url最后有一个斜杠,注意它是一个目录.另请注意,通过在重定向标头中使用传入请求主机名,Apache是“智能”的.到目前为止都很好.但是,当使用具有负载平衡的Nginx时,将301发送到客户端,而不将Nginx上游名称转换回实际的服务器/域.所以客户将收到以下内容:
GET http://Nginx.myserver.com/somedirectory
HTTP 301 Moved Permanently
...
Location: http://myproject:8000/somedirectory/
myproject是Nginx上游后端的名称.它不是客户端可以解析的实际主机.在我看来,客户端应该被重定向到
http://Nginx.myserver.com/somedirectory/
最佳答案
原来Nginx有很多proxy redirect选项来处理这类问题.我最终使用了这样的东西:
location / {
proxy_pass http://myproject;
proxy_set_header Host myproject;
proxy_redirect http://myproject/ $scheme://$host/;
proxy_redirect http://myproject:8000/ $scheme://$host/;
}
这基本上用$host替换了上游名称并删除了端口.这在我的情况下工作,因为我在HTTP / HTTPS的默认端口上托管Nginx.如果Nginx在非默认端口上运行,则需要这样的东西:
proxy_redirect http://myproject/ $scheme://$host:$server_port/;
proxy_redirect http://myproject:8000/ $scheme://$host:$server_port/;