前端或后端 (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
会。
我在后端服务器应用程序前面设置了一个 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
会。