更新:我在这篇文章的底部附加了第二次尝试。它正在“工作”,但我想让我最初的想法发挥作用。
我正在尝试通过重定向服务器将域的 https 请求重定向到另一个域。
我将使用https://website.com
,https://website2.com
和https://myredirectserver.com
作为示例。
我购买了一个 SSL 证书website.com
,它的 DNS 是 CNAMEDwww
到的myredirectserver.com
。也有一个 SSL 证书mywebsite2.com
,它目前位于服务器上。一切都很好作为一个独立的域。
myredirectserver.com
有两个指向两个 IP 地址的流量管理 A 记录(高可用性)。
这两个 IP 地址在防火墙中通过 NAT 转换为代理服务器。
在该代理服务器上,有一个运行 Alpine/Nginx 的 Docker 容器。
容器的 Dockerfile:
FROM nginx:1.17.7-alpine
RUN apk add --no-cache tzdata
ENV TZ America/Chicago
RUN rm /etc/nginx/conf.d/default.conf
COPY myredirectserver.com.conf /etc/nginx/conf.d/myredirectserver.com.conf
RUN rm /etc/nginx/nginx.conf
COPY nginx.conf /etc/nginx/nginx.conf
COPY myredirectserver.com.crt /etc/nginx/ssl/myredirectserver.com.crt
COPY myredirectserver.com.key /etc/nginx/ssl/myredirectserver.com.key
COPY proxy_params /etc/nginx/proxy_params
启动它的docker run
部分(通过后端代码安装了用于动态配置文件创建的卷):
docker run --name=myredirectserver --restart always --log-opt max-size=50m --log-opt max-file=5 -d -v /etc/nginx/myredirectserverBuild:/etc/nginx/myredirectserverBuild -v /etc/nginx/myredirectserverSSL:/etc/nginx/myredirectserverSSL -p 8224:443 -p 8223:80 myredirectserver
在该 Docker 容器中,Nginx 配置文件位于/etc/nginx/conf.d/myredirectserver.com.conf
:
#I DO NOT KNOW IF THIS IS CORRECT FOR WHAT I NEED
server {
listen 443 ssl;
server_name myredirectserver.com www.myredirectserver.com;
ssl_certificate /etc/nginx/ssl/myredirectserver.com.crt;
ssl_certificate_key /etc/nginx/ssl/myredirectserver.com.key;
}
server {
listen 80;
server_name myredirectserver.com www.myredirectserver.com;
return 301 https://www.myredirectserver.com$request_uri;
}
include /etc/nginx/myredirectserverBuild/*.conf;
最后的包含文件包含原始请求的域,mywebsite.com.conf
:
## www.mywebsite.com virtual host
server {
listen 443 ssl;
server_name mywebsite.com www.mywebsite.com;
ssl_certificate /etc/nginx/myredirectwebsiteSSL/mywebsite.com.crt;
ssl_certificate_key /etc/nginx/myredirectwebsiteSSL/mywebsite.com.key;
}
server {
listen 80;
server_name mywebsite.com www.mywebsite.com;
return 301 https://www.mywebsite2.com$request_uri; <--- The redirect
}
该website2.com
域位于主机服务器上,我可以正常请求该域。我只是无法弄清楚我哪里出错了。我觉得它在我的 Nginx 配置中,但我的 Nginx 语法并不是最好的。为什么我return 301
不工作并将我重定向到域?
故障排除期间的几点注意事项:
wget 0.0.0.0:8223
返回:
--2021-07-26 23:44:19-- http://0.0.0.0:8223/
Connecting to 0.0.0.0:8223... connected.
HTTP request sent, awaiting response... 301 Moved Permanently
Location: https://www.mywebsite2.com/ [following]
--2021-07-25 23:44:19-- https://www.mywebsite2.com/
Resolving www.mywebsite2.com (www.mywebsite2.com)... XX.XXX.XXX.XXX
Connecting to www.mywebsite2.com (www.mywebsite2.com)|XX.XXX.XXX.XXX|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: unspecified [text/html]
Saving to: ‘index.html’
index.html [ <=> ] 37.56K 231KB/s in 0.2s
2021-07-25 23:44:20 (231 KB/s) - ‘index.html’ saved [38461]
curl --resolve www.myredirectserver.com:8223:0.0.0.0 http://www.myredirectserver.com/
返回超时,浏览器也是如此。
在本地网络上,在地址栏 ( 192.168.69.140:8223
) 中输入 Docker 容器的 IP 会将我带到https://www.website2.com
.
输入https://192.168.69.140:8224
会将我带到安全飞溅警告页面。单击proceed
,它给了我一个404
.
我不知所措,因为当请求到达 CNAME 的 IP 时,我不知道如何处理它myredirectserver.com
。如何告诉 Nginx 查看原始请求的域website.com
?
更新(第二次尝试):
我停止了 Docker 容器,并将DNSCNAME
中的www
级别更改为指向一个已经存在的高可用 IP。我会打电话destinationserver.net
的。所以基本上:
`mywebsite.com`
|
|---> CNAME 'destinationserver.net'
`destinationserver.net`
|
|----> A XX.XXX.XXX.XXX --> Firewall --> Proxy
|----> A XX.XXX.XXX.XXX --> Firewall --> Proxy
在destinationserver.net
服务器上,我在 Nginx 配置中有以下内容website.com
:
# ## www.mywebsite.com virtual host
server {
listen 8222 ssl;
server_name mywebsite.com www.mywebsite.com;
ssl_certificate /etc/nginx/ssl/mywebsite.com.crt;
ssl_certificate_key /etc/nginx/ssl/mywebsite.com.key;
return 301 http://www.mywebsite2.com$request_uri;
}
server {
listen 8221;
server_name mywebsite.com www.mywebsite.com;
return 301 https://www.mywebsite2$request_uri;
}
正如我在问题第一行的“更新”中所述,这是“有效的”,但在单独的空间中处理这些重定向会很好,因此是 Docker 容器的想法。
我已经放弃了重定向服务器的想法,而是做了两件事:
我向根域添加了一个 ANAME(别名),因此
www
请求将转到与非请求相同的高可用流量管理器位置www
。然后,在Nginx
配置中,我添加了以下内容来重定向请求:这适用于我需要它做的事情,所以除非有人提出更好的方法,否则我会保持原样。