![如何让 nginx 正确代理(包括在标题中设置的基本身份验证凭据)Apache?](https://linux22.com/image/702440/%E5%A6%82%E4%BD%95%E8%AE%A9%20nginx%20%E6%AD%A3%E7%A1%AE%E4%BB%A3%E7%90%86%EF%BC%88%E5%8C%85%E6%8B%AC%E5%9C%A8%E6%A0%87%E9%A2%98%E4%B8%AD%E8%AE%BE%E7%BD%AE%E7%9A%84%E5%9F%BA%E6%9C%AC%E8%BA%AB%E4%BB%BD%E9%AA%8C%E8%AF%81%E5%87%AD%E6%8D%AE%EF%BC%89Apache%EF%BC%9F.png)
编辑:如果您对如何改进问题或缺少哪些细节有想法,请发表评论。
预期结果:
我正在尝试将 nginx 部署为反向代理,以便让我公开 Apache 提供的文件,而无需提供 Apache 所需的基本身份验证凭据。我的计划是在从代理发送到 Apache 的标头中“静态”提供基本身份验证凭据,以便用户无需拥有(或看到/知道)凭据即可访问文件。
设置:
Apache 需要通过 https 进行基本身份验证。要部署的反向代理本身由处理传入 (docker) 主机的流量的 nginx 代理。(docker) 主机入口 nginx 仅侦听 443,(docker) 主机上/内的流量为 http。
因此设置如下:
https >> [dockerhost ingress nginx] >> http >> [nginx reverse proxy] >> https >> [apache file server (basic auth)]
我使用的是最新的 nginx docker 镜像,未做任何修改(只添加了配置文件)。对于 dockerhost 入口代理,我使用的是https://github.com/jwilder/nginx-proxy。Apache 正在从Hetzner 储物盒。我无法查看或更改其配置,Hetzner 说他们无法帮助我,因为他们不正式支持这种设置。他们最后的回复是:
我们的 Apache 不需要任何特定的标头。所有必需的都是通过正确的主机名(因为 SNI)发出的请求以及通过端口 443 上的 SLL/HTTPS 发出的正确凭据。
问题:
直接地,不需要 nginx 代理,我可以在浏览器中或通过 curl 通过基本身份验证提示后访问 Apache 上的文件。
当我尝试通过代理访问文件并尝试将凭据“静态地”作为 nginx 配置中的标头传递时,我只得到 404(来自 Apache)。
但是我可以(这让我很困惑)在代理时通过代理访问文件,而无需“静态”基本身份验证,只需在提示符下提供我的凭据即可。
因此,它似乎通过了基本身份验证,但无法访问任何文件,这让我感到困惑。
我尝试过的:
我最初的做法是使用@Shai 在这里提供的位置块:如何使用nginx代理到需要身份验证的主机?
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://6.6.6.6:80;
proxy_set_header Authorization "Basic a2luZzppc25ha2Vk";
}
但这会产生上述行为。从那时起,我只是开始尝试注释掉并添加不同的指令(例如这里提供的指令:如何让 nginx 将 HTTP_AUTHORIZATION 标头传递给 Apache),但无济于事。
我非常感谢任何指点。
干杯,威尔
答案1
尝试使用显式凭据进行代理:
proxy_pass http://user:[email protected]:80;