Actualizar:He adjuntado un segundo intento al final de esta publicación. Está "funcionando", pero me gustaría que mi idea original funcionara.
Estoy intentando redirigir una solicitud https de un dominio a otro a través de un servidor de redireccionamiento.
Usaré https://website.com
, https://website2.com
y https://myredirectserver.com
como ejemplos.
Compré un certificado SSL para website.com
y su DNS tiene CNAMED www
en myredirectserver.com
. También hay un certificado SSL para mywebsite2.com
, y actualmente se encuentra en un servidor. Todo está bien como dominio independiente.
myredirectserver.com
tiene dos Registros A de Gestión de Tráfico (alta disponibilidad) que apuntan a dos direcciones IP.
Esas dos direcciones IP están conectadas por NAT en un firewall a un servidor proxy.
En ese servidor proxy, hay un contenedor Docker que ejecuta Alpine/Nginx.
El Dockerfile para el contenedor:
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
La docker run
parte para iniciarlo (hay volúmenes montados para la creación de archivos de configuración dinámica a través del código backend):
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
En ese contenedor Docker, el archivo de configuración de Nginx se encuentra en /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;
El archivo de inclusión al final contiene eloriginaldominio solicitado, 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
}
El website2.com
dominio está en el servidor host y puedo solicitarlo con normalidad. Simplemente no puedo entender dónde me he equivocado. Siento que está en mis configuraciones de Nginx, pero mi sintaxis de Nginx no es la mejor. ¿Por qué return 301
no funciona y me redirige al dominio?
Un par de notas durante la resolución de problemas:
wget 0.0.0.0:8223
devoluciones:
--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/
devuelve un tiempo de espera, al igual que el navegador.
Mientras estoy en la red local, ingresar la IP del contenedor Docker en la barra de direcciones ( 192.168.69.140:8223
) me lleva a https://www.website2.com
.
Entrar https://192.168.69.140:8224
me lleva a una página de advertencia de seguridad. Hago clic proceed
y me da un 404
.
Estoy perdido porque no sé cómo manejar la solicitud cuando llega a la IP del CNAME myredirectserver.com
. ¿Cómo puedo decirle a Nginx que mire el dominio solicitado original website.com
?
Actualización (segundo intento):
Detuve el contenedor Docker y cambié el CNAME
nivel www
en DNS para que apunte a una IP de alta disponibilidad ya existente. Lo llamaré destinationserver.net
. Así que básicamente:
`mywebsite.com`
|
|---> CNAME 'destinationserver.net'
`destinationserver.net`
|
|----> A XX.XXX.XXX.XXX --> Firewall --> Proxy
|----> A XX.XXX.XXX.XXX --> Firewall --> Proxy
En el destinationserver.net
servidor, tengo lo siguiente en la configuración de Nginx para 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;
}
Como dije en la 'Actualización' en la primera línea de la pregunta, esto está "funcionando", pero sería bueno manejar estas redirecciones en un espacio separado, de ahí la idea del contenedor Docker.
Respuesta1
Descarté la idea del servidor de redireccionamiento y opté por dos cosas:
Agregué un ANAME (Alias) al dominio raíz para que www
las solicitudes vayan a la misma ubicación del administrador de tráfico de alta disponibilidad que las que no son www
solicitudes. Luego, en la Nginx
configuración, agregué lo siguiente para redirigir las solicitudes:
# ## 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;
}
Esto funciona para lo que necesito, así que, a menos que alguien intervenga con un método mejor, lo dejaré como está.