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
$hostlugar de$server_namesi 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
308evita que los navegadores cambien el método de solicitud dePOSTaGETpara 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.phpy será redirigido a exactamentehttps://192.168.0.100/index.php.Lo uso
listen [::]:80en mi host porque lo hebindv6onlyconfiguradofalse, por lo que también se une al zócalo ipv4. cámbielo alisten 80si no desea IPv6 o si desea vincularlo a otra parte.La solución de Saif Bechan utiliza la
server_nameque 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$hostfue 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
POSTsolicitud a su servidor. Si la respuesta del servidor con una30xredirección simple, el contenido POST se perderá. Lo que sucede es que el navegador / cliente va a actualizar la solicitud de SSL, pero rebajar elPOSTque unaGETpetición. LosPOSTparámetros se perderán y se realizarán solicitudes incorrectas a su servidor.La solución es simple. Necesita usar una
HTTP 1.1 307redirección. Esto se detalla en RFC 7231 S6.4.7:La solución, adaptada de la solución aceptada, es usar
307en 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
$hostrepetirá lo que el navegador envíe en elHostencabezado 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_namelugar de$host.$server_namesiempre evalúa lo que pones en laserver_namedeclaración. Pero si tiene varios subdominios allí o usa un comodín, eso no funcionará, ya que$server_namesolo usa la primera entrada después de laserver_namedeclaració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_serverbloque que no se usa$hosty 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_serverbloqueo 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
servidor { escuchar 80 por defecto; escuchar [::]: 80 por defecto; return 307 https: // $ host $ request_uri; }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