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

u12*_*123 5 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
Run Code Online (Sandbox Code Playgroud)

这似乎使它工作 - 例如,我可以登录到我的后端服务器并导航到不同的页面.如果我没有proto选项,我只能登录但不能导航到任何其他页面.

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

backend my-backend
  http-request add-header X-Forwarded-Proto https if { ssl_fc }
  server my-backend 127.0.0.1:9000
Run Code Online (Sandbox Code Playgroud)

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

那么这是正确的方法呢?在前端或后端还是没关系?

Mic*_*bot 9

没关系.当你有多个后端时,通常在前端执行此操作是有意义的.

您也可以http-request set-header X-Forwarded-Proto在前端使用,而不是使用reqadd.

这些req*指令的功能要比http-request后者的功能要大得多,因此后者是首选,但是有一个重要的原因,你应该更喜欢它,这里以及为什么你应该使用set-header而不是add-header:你不希望客户端能够伪造标题只有代理应该注入.对于非https前端,还应该http-request set-header X-Forwarded-Proto http使上游头不可能出错.该add-header选项reqadd同样不会删除任何同名的现有标头set-header.

  • “ http-request set-header X-Forwarded-Proto https”。不使用冒号和反斜杠。 (2认同)
  • @CorinFletcher我只见过在前端使用`X-Forwarded-Port: <int>`来通知后端请求到达前端的端口,而不是它被转发到的位置。在端口 8080 上作为 HTTP 到达前端的 HTTP 请求将(例如)包含“X-Forwarded-Proto: http”和“X-Forwarded-Port: 8080”,以便后端可以有足够的信息来重建URL `${x-forwarded-proto}://example.com:${x-forwarded-port}/`,如果需要的话。在 HAProxy 中,这将是“http-request set-header X-Forwarded-Port %fp”。 (2认同)