Nginx - 重写 URL 并保留基本身份验证

Nginx - 重写 URL 并保留基本身份验证

简化我的问题,但这基本上是我想要做的:

我有一个网站https://example.com

文件位于某个较长的路径中:https://example.com/foo/bar/this/that/file

我有一个/etc/hosts文件,其中有如下条目:

1.2.3.4 ex.com

1.2.3.4的 IP 地址在哪里example.com

我想访问ex.com/file并重定向到https://example.com/foo/bar/this/that/file


问题

如果我使用proxy_pass,我会收到错误消息,因为我的 SSL 证书无效ex.com

server {
    listen 80;
    server_name ex.com;

    rewrite ^/(.*) /foo/bar/this/that/$1;

    location / {
        proxy_pass          http://backend;
    }
}

如果我使用return 301,当我运行 curl 时它似乎会丢失我的基本身份验证凭据

server {
    listen 80;
    server_name ex.com;

    return 301 https://example.com/foo/bar/this/that$request_uri;
}

我做错了什么?是否可以在其他主机名上侦听并将完整请求重定向到正确的 URL?

答案1

我遇到了同样的问题。proxy_pass由于我的 nginx 没有证书颁发机构来评估目标域/服务器,因此引发 SSL 握手超时。

重写或return 301不起作用,因为身份验证标头被剥离了。但奇怪的是,如果我尝试在本地主机中运行两个 nginx 容器,我能够注意到身份验证标头保持完整。尝试重写到远程主机时,会出现身份验证标头消失的问题。

我通过使用强制插入身份验证信息的 lambda 解决了这个问题,但这不是一个好方法。

答案2

您无法将身份验证从一个 URL 保留到另一个 URL。SSL 错误与您的问题无关。如果您没有针对 ex.com 的有效 SSL,则无法使用 SSL。

您有 2 个选择。

  1. 在长地址设置基本身份验证https://example.com/foo/bar/this/that/file 在这种情况下,重定向后将立即询问密码。
  2. 在短地址设置基本身份验证ex.com/file。在这种情况下,将要求输入密码,提示后用户将被重定向。

答案3

服务器配置时没有 SSL。我想你会使用certbot它的nginx插件,它会为你处理 SSL 内容。其次,你必须将身份验证指令放在实际处理经过身份验证的用户请求的 Web 服务器上。即,如果你的服务器是ex.comexample.com,而带有受限文件的服务器是example.com,那么必须为 进行任何身份验证配置example.com

proxy_pass是不同的。如果你使用proxy_pass 反而或者redirectrewrite 301您可以在后端服务器上配置身份验证。

最后要注意的是,为两个域名ex.com和添加 SSL 证书example.com。否则,在尝试读取时会出现错误https://ex.com/,并且您不会看到干净的重定向,而是会看到一条大消息,警告您证书无效。

相关内容