我有一个 nginx 1.6.2 服务器作为后端运行在执行 SSL 终止的负载平衡器后面。与后端服务器的所有通信都通过 HTTP 进行。
发生的事情示意图:
/--http---> frontend:80 --\
client --+ +--http---> backend:8000
\--https--> frontend:443 --/
LOAD BALANCER BACKENDS
Run Code Online (Sandbox Code Playgroud)
出于测试目的,我目前只有一个后端。负载均衡器运行 HAProxy 1.5,我可以控制它。
我在后端 nginx 配置的块中有一个非常典型的try_files指令server:
server {
server_name frontend;
...
try_files $uri $uri/ =404;
...
}
Run Code Online (Sandbox Code Playgroud)
现在,默认情况下,当我访问没有斜杠的目录时,例如https://frontend/somedir,nginx 想要将 HTTP 301 重定向发送到绝对 URL,例如http://frontend:8000/somedir/.
我可以让 nginx 省略 8000 端口号使用port_in_redirect off.
但是,我似乎无法http://在 nginx 生成的重定向开始时更正该方案。我可以让 nginx 做的最好的事情是从https://frontend/somedirto重定向http://frontend/somedir/,有效地剥离 SSL!
负载均衡器正在发送一个X-Forwarded-Proto标头,但我看不到 nginx 在制作重定向时有任何方式来查询它;事实上,2012 年有一个回答说 …