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

前端或后端的X-Forwarded-Proto https(HAProxy)?,https,haproxy,Https,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 这似乎使它工作-例如,我可以登录到我的后端服务

我已经在后端服务器应用程序前面设置了一个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选项,我只能登录,但不能导航到任何其他页面

现在,如果在后端添加该选项,请改为(从前端删除该选项),方法是:

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


那么,哪种方法才是正确的呢?在前端或后端还是无关紧要?

无关紧要。当您有多个后端时,在前端执行此操作通常是有意义的


您还可以在前端使用
http请求集头X-Forwarded-Proto
,而不是使用
reqadd


req*
指令的功能比
http请求
旧得多,因此后者通常是首选的,但您更喜欢它的一个重要原因是,这里是为什么您应该使用
set header
而不是
add header
:您不希望客户端能够伪造只有代理才应该注入的头。对于非https前端,您还应该
http请求设置头X-Forwarded-Proto http
,这样就不可能存在不正确的上游头。
addheader
选项与
reqadd
一样,不会删除任何同名的现有头,而
set header
会删除

好的,那么在前端,您的意思是我应该设置“http请求集头X-Forwarded-Proto https if{ssl_fc}”还是“http请求集头X-Forwarded-Proto:\https”?不确定最后一个版本的格式是否正确。
http请求集头X-Forwarded-Proto-https
。不使用冒号和反斜杠。另请注意
http请求集标题X-Forwarded-Port
可用于转发到非标准port@CorinFletcher我只见过在前端使用
X-Forwarded-Port:
通知后端请求到达前端的端口,而不是它被转发到的地方。作为端口8080上的HTTP到达前端的HTTP请求(例如)将包含
X-Forwarded-Proto:HTTP
X-Forwarded-port:8080
,以便在需要的情况下,后端可以有足够的信息来重建URL
${X-Forwarded-Proto}://example.com:${X-Forwarded-port}/
。在HAProxy中,这将是
http请求集头X-Forwarded-Port%fp
backend my-backend
  http-request add-header X-Forwarded-Proto https if { ssl_fc }
  server my-backend 127.0.0.1:9000