haproxy + nginx:https 尾部斜杠重定向到 http

haproxy + nginx:https 尾部斜杠重定向到 http

我有一个设置,其中 HTTP(S) 流量从 HAProxy 转到 nginx。

            HAProxy    nginx
HTTP -----> :80  ----> :9080
HTTPS ----> :443 ----> :9443

我在处理由从 https 到 http 的尾部斜杠引起的隐式重定向时遇到问题,如下所示:

$ curl -k -I https://www.example.com/subdir
HTTP/1.1 301 Moved Permanently
Server: nginx/1.2.4
Date: Thu, 04 Oct 2012 12:52:39 GMT
Content-Type: text/html
Content-Length: 184
Location: http://www.example.com/subdir/

原因显然是 HAProxy 充当 SSL 解包器,而 nginx 仅看到 http 请求。我尝试在 HAProxy 配置上将 X-Forwarded-Proto 设置为 https,但没有任何效果。

我的 nginx 设置如下:

server {
  listen       127.0.0.1:9443;
  server_name  www.example.com;

  port_in_redirect off;

  root   /var/www/example;
  index  index.html index.htm;
}

HAProxy 配置中的相关部分如下:

frontend https-in
    bind *:443 ssl crt /etc/example.pem prefer-server-ciphers
    default_backend nginxssl

backend nginxssl
    balance roundrobin
    option forwardfor
    reqadd X-Forwarded-Proto:\ https
    server nginxssl1 127.0.0.1:9443

答案1

我也遇到了同样的问题。在这种情况下,Nginx 会执行某种自动重定向,但您可以使用两个位置块捕获和修改默认行为:

# This location will catch the redirect nginx will do automatically
# because we are using an exact match ("=")
location = /subdir {
    return 301 https://yourdomainname/subdir/;
}

# This location will be used for the other requests
location /subdir {
}

希望这可以帮助

答案2

您的后端 nginx 流量是否应为 SSL(基于端口 9443)?如果是这样,那么看起来您的 nginxssl 后端中的服务器指令缺少 ssl 关键字,因此;

server nginxssl1 127.0.0.1:9443 ssl

这将导致 haproxy 使用 SSL 与 nginx 服务器进行出站通信。或者也许您是故意这样做的,以便进行测试?

无论如何,在前端和后端指定 HTTP 模式也是值得的,因为默认模式是 TCP。

答案3

这实际上不是 http 与 https 的问题,而是您期望没有尾随斜杠,但如果 subdir 正如其名称所暗示的那样是一个子目录,那么您请求中的语法就是错误的,并且 nginx 会为您修复它,以便您可以重新发布有效请求,该请求将构成从该目录中找到的相关对象发出的所有后续请求的正确基础。

我认为,http 到 http 或 https 到 https 的操作是一样的。

相关内容