简化我的问题,但这基本上是我想要做的:
我有一个网站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 个选择。
- 在长地址设置基本身份验证https://example.com/foo/bar/this/that/file 在这种情况下,重定向后将立即询问密码。
- 在短地址设置基本身份验证
ex.com/file
。在这种情况下,将要求输入密码,提示后用户将被重定向。
答案3
服务器配置时没有 SSL。我想你会使用certbot
它的nginx
插件,它会为你处理 SSL 内容。其次,你必须将身份验证指令放在实际处理经过身份验证的用户请求的 Web 服务器上。即,如果你的服务器是ex.com
和example.com
,而带有受限文件的服务器是example.com
,那么必须为 进行任何身份验证配置example.com
。
proxy_pass
是不同的。如果你使用proxy_pass
反而或者redirect
,rewrite 301
您可以在后端服务器上配置身份验证。
最后要注意的是,为两个域名ex.com
和添加 SSL 证书example.com
。否则,在尝试读取时会出现错误https://ex.com/
,并且您不会看到干净的重定向,而是会看到一条大消息,警告您证书无效。