
Estoy intentando que Nginx reescriba las solicitudes entrantes a un sitio con el prefijo de mi servidor https://
( http://
esto se debe a que un CMS utilizado en este sitio fuerza URI en lugar de rutas relativas, esencialmente rompiendo todo el sitio al crear imágenes, scripts y hojas de estilo). indisponible).
Actualmente estoy intentando actualizar una directiva existente implementada por un predecesor, pero me encuentro limitado por mi conocimiento de la sintaxis de configuración de Nginx. Aquí está el código:
if ($ssl_protocol = "") {
rewrite ^ https://$http_host$request_uri? permanent;
}
Actualmente he comentado este código para evitar reescrituras forzadas de http://
to https://
, pero no puedo revertir el proceso sin dañar el sitio. Esto es lo que he probado hasta ahora:
if ($ssl_protocol = "https") {
rewrite ^ http://$http_host$request_uri? permanent;
}
y
# also tried ($ssl_protocol != "")
if (!($ssl_protocol = "")) {
rewrite ^ http://$http_host$request_uri? permanent;
}
El primero no parece tener efecto. El HTML enviado al cliente aún realiza solicitudes HTTPS que no se reescriben.
El segundo fragmento tampoco parece tener ningún efecto: si lo entiendo correctamente (aunque todavía estoy algo sorprendido), Nginx no admite la negación booleana.
¿Cuál sería la mejor manera (o una forma funcional) de hacer esto?
EDITAR:Intenté agregar el código de la respuesta de @NathanC; sin embargo, esta reescritura incondicional provoca un bucle de redireccionamiento. Todavía se agradece la ayuda.
Respuesta1
La forma más limpia sería:
if ( $scheme = "https" ) {
return 301 http://example.com$request_uri
o en algún lugar entre eso y la respuesta de Nathan, donde su bloque de servidor SSL predeterminado contiene simplemente elreturn 301
(Cualquiera que sea el bloque SSL, tendrás que observar de cerca el tuyo para ver cómo se implementa y se adapta)No tiene sentido hacer expresiones regulares para una simple redirección
return
-http://nginx.org/en/docs/http/ngx_http_rewrite_module.html#return
Editar: acabo de notar que hay una variable $https
que se puede usar en la declaración if.Devuelve " "
si no es https:
if ( $https = "on" ) {
...
Tenga en cuenta que, mientras prueba los cambios, debe utilizar una 302
redirección temporal en lugar de 301
permanente, para evitar tirones de pelo cuando descubra que lo solucionó una hora antes pero los cambios no se reflejaron en su navegador :)
Respuesta2
Ni siquiera necesitas esto ya que puedes forzar que todo el tráfico https vaya a http de esta manera:
server {
listen 443;
ssl on;
server_name example.com;
rewrite ^(.*) http://example.com$1 permanent;
}
Referencia:https://stackoverflow.com/questions/3470290/nginx-redirect-https-to-http