Quiero reescribir todas las solicitudes http en mi servidor web para que sean solicitudes https, comencé con lo siguiente:
servidor { escucha 80; ubicación / { reescribir ^ (. *) https: //mysite.com$1 permanente; } ...
Un problema es que esto elimina cualquier información de subdominio (por ejemplo, node1.mysite.com/folder), ¿cómo podría reescribir lo anterior para redirigir todo a https y mantener el subdominio?
Respuestas:
Forma correcta en nuevas versiones de nginx
Resultó que mi primera respuesta a esta pregunta fue correcta en cierto momento, pero se convirtió en otro obstáculo: para mantenerse actualizado, consulte Imposiciones de reescritura de impuestos
Muchos usuarios de SE me han corregido, por lo que el crédito recae en ellos, pero lo más importante, aquí está el código correcto:
fuente
$host
lugar de$server_name
si está usando subdominios.NOTA: https://serverfault.com/a/401632/3641 proporcionó la mejor manera de hacerlo , pero se repite aquí:
En el caso más simple, su host será reparado para que sea su servicio al que desea enviarlo; esto hará una redirección 301 al navegador y la URL del navegador se actualizará en consecuencia.
A continuación se muestra la respuesta anterior, que es ineficiente debido a expresiones regulares, un 301 simple es genial, como lo muestra @kmindi
He estado usando nginx 0.8.39 y superior, y usé lo siguiente:
Envía una redirección permanente al cliente.
fuente
Creo que la mejor y única forma debería ser usar un redireccionamiento HTTP 301 movido permanentemente como este:
La redirección HTTP 301 movida permanentemente también es la más eficiente porque no hay expresiones regulares para evaluar, de acuerdo con fallas ya mencionadas .
El nuevo HTTP 308 Moved Permanentemente conserva el método Request y es compatible con los principales navegadores . Por ejemplo, el uso
308
evita que los navegadores cambien el método de solicitud dePOST
aGET
para la solicitud de redireccionamiento.Si desea preservar el nombre de host y el subdominio, este es el camino.
Esto todavía funciona si no tienes DNS , ya que también lo estoy usando localmente. Estoy solicitando, por ejemplo, con
http://192.168.0.100/index.php
y será redirigido a exactamentehttps://192.168.0.100/index.php
.Lo uso
listen [::]:80
en mi host porque lo hebindv6only
configuradofalse
, por lo que también se une al zócalo ipv4. cámbielo alisten 80
si no desea IPv6 o si desea vincularlo a otra parte.La solución de Saif Bechan utiliza la
server_name
que en mi caso es localhost pero que no es accesible a través de una red.La solución de Michael Neale es buena, pero de acuerdo con las fallas, hay una mejor solución con la redirección 301;)
fuente
Dentro del bloque del servidor también puede hacer lo siguiente:
fuente
Lo anterior no funcionó con nuevos subdominios que se crean todo el tiempo. por ejemplo, AAA.example.com BBB.example.com para aproximadamente 30 subdominios.
Finalmente obtuve una configuración que funciona con lo siguiente:
fuente
301 https://*/
o cancelaría la solicitud prematuramente en las otras respuestas aquí.server_name _;
con$host
fue la respuesta que hizo el truco. +1_
con el dominio real, por ejemplo.domain.com
, tenía dos servidores y nginx accidentalmente estaba dirigiendo uno de mis servidores al servidor predeterminado.Publiqué un comentario sobre la respuesta correcta hace mucho, mucho tiempo con una corrección muy importante, pero creo que es necesario resaltar esta corrección en su propia respuesta. Ninguna de las respuestas anteriores es segura de usar si en algún momento tuvo una configuración HTTP no segura y esperaba contenido del usuario, tiene formularios, aloja una API o ha configurado un sitio web, herramienta, aplicación o utilidad para hablar con su sitio.
El problema ocurre cuando se realiza una
POST
solicitud a su servidor. Si la respuesta del servidor con una30x
redirección simple, el contenido POST se perderá. Lo que sucede es que el navegador / cliente va a actualizar la solicitud de SSL, pero rebajar elPOST
que unaGET
petición. LosPOST
parámetros se perderán y se realizarán solicitudes incorrectas a su servidor.La solución es simple. Necesita usar una
HTTP 1.1 307
redirección. Esto se detalla en RFC 7231 S6.4.7:La solución, adaptada de la solución aceptada, es usar
307
en su código de redireccionamiento:fuente
Logré hacerlo así:
https://stackoverflow.com/a/36777526/6076984
fuente
Estoy ejecutando ngnix detrás de un AWS ELB. El ELB está hablando con ngnix a través de http. Como el ELB no tiene forma de enviar redireccionamientos a los clientes, verifico el encabezado X-Fordered-Proto y redirijo:
fuente
Si usted
return 301 https://$host$request_uri;
es la respuesta predeterminada en el puerto 80, su servidor tarde o temprano puede obtener una lista de proxies abiertos [1] y comenzar a ser abusado para enviar tráfico a otra parte de Internet. Si sus registros se llenan de mensajes como este, entonces sabe que le ha sucedido:El problema es que
$host
repetirá lo que el navegador envíe en elHost
encabezado o incluso el nombre de host de la línea de apertura de HTTP, como esta:Debido a ese problema, algunas otras respuestas aquí recomiendan usar en
$server_name
lugar de$host
.$server_name
siempre evalúa lo que pones en laserver_name
declaración. Pero si tiene varios subdominios allí o usa un comodín, eso no funcionará, ya que$server_name
solo usa la primera entrada después de laserver_name
declaración y, lo que es más importante, solo hará eco de un comodín (no lo expandirá).Entonces, ¿cómo soportar múltiples dominios manteniendo la seguridad? En mis propios sistemas, he lidiado con este dilema enumerando primero un
default_server
bloque que no se usa$host
y luego enumerando un bloque comodín que sí:(También puede enumerar más de un dominio en el segundo bloque).
Con esa combinación, los dominios incomparables serán redirigidos a algún lugar codificado (siempre
example.com
), y los dominios que coincidan con los suyos irán al lugar correcto. Su servidor no será útil como proxy abierto, por lo que no atraerá problemas.Si se siente mal, supongo que también podría hacer que el
default_server
bloqueo no coincida con ninguno de sus dominios legítimos y sirva para algo ofensivo. . . .[1] Técnicamente "proxy" es la palabra incorrecta, porque su servidor no está saliendo y cumpliendo con las solicitudes de los clientes, simplemente enviando una redirección, pero no estoy seguro de cuál sería la palabra correcta. Tampoco estoy seguro de cuál es el objetivo, pero llena sus registros con ruido y consume su CPU y ancho de banda, por lo que también podría detenerlo.
fuente
Parece que nadie realmente lo hizo al 100%. Para que las solicitudes del puerto 80 vayan a sus 443 equivalentes para un servidor web completo, debe usar la directiva listen , no la directiva server_name para especificar el nombre general. Ver también https://nginx.org/en/docs/http/request_processing.html
Y asegúrese de verificar lo que ya está en /etc/nginx/conf.d/ porque la mayoría de las veces tuve problemas en los que default.conf devolvió algunos vhost existentes. Mi orden de trabajo con problemas de nginx siempre comienza moviendo el archivo predeterminado, volviendo a comentar línea por línea para ver dónde sale mal.
fuente
fuente