前端或后端 (HAProxy) 中的 X-Forwarded-Proto https?

X-Forwarded-Proto https in frontend or backend (HAProxy)?

我在后端服务器应用程序前面设置了一个 HAProxy 以启用 HTTPS。我读过我需要设置 X-Forward-Proto https.

haproxy.cfg 文件中,我尝试在 前端 中使用:

frontend haproxy
  bind :8443 ssl crt frontend/server.pem
  reqadd X-Forwarded-Proto:\ https
  default_backend my-backend

这似乎让它起作用了——例如我既可以登录到我的后端服务器,也可以导航到不同的页面。如果我没有 proto 选项,我只能登录而不能导航到任何其他页面。

现在我如果在 后端 中添加选项(从前端删除它):

backend my-backend
  http-request add-header X-Forwarded-Proto https if { ssl_fc }
  server my-backend 127.0.0.1:9000

它也有效,我可以在我的后端服务器应用程序中导航不同的页面。

那么正确的做法是什么?在前端还是在后端还是无所谓?

没关系。当您有多个后端时,在前端执行此操作通常很有意义。

您也可以在 front-end 中使用 http-request set-header X-Forwarded-Proto,而不是使用 reqadd

req* 指令比 http-request 的功能要老得多,所以后者通常是首选,但这里有一个重要的原因让您更喜欢它,以及为什么您应该使用 set-header 而不是 add-header:您不希望客户端能够伪造只有代理才能注入的 header。对于 non-https front-ends,你也应该 http-request set-header X-Forwarded-Proto http 这样就不可能出现错误的上游 header。 add-header 选项与 reqadd 一样,不会删除任何现有的同名 header,而 set-header 会。