通過 CNAME 和 Nginx Docker 容器將安全域重定向到另一個域
**更新:**我在這篇文章的底部附加了第二次嘗試。它正在“工作”,但我想讓我最初的想法發揮作用。
我正在嘗試通過重定向伺服器將域的 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 容器,並將DNS
CNAME
中的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
配置中,我添加了以下內容來重定向請求:# ## 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 https://www.mywebsite2.com$request_uri; } server { listen 8221; server_name mywebsite.com www.mywebsite.com; return 301 https://www.mywebsite2$request_uri; }
這適用於我需要它做的事情,所以除非有人提出更好的方法,否則我會保持原樣。