Solución 1:
Tu opción 1:
return 301 $scheme://$host$request_uri;
Es exactamente lo que quieres.
No estoy seguro de por qué el rewrite ^ http://$host$request_uri? permanent;
daría como resultado un 302 en lugar de 301. Esa es la sintaxis adecuada para obligarlo a devolver un 301.
Solución 2:
Técnicamente, puedes usar ambas opciones. Pueden funcionar.
Según la documentación de NGINX, use return
si puedes . Es más simple y rápido porque NGINX deja de procesar la solicitud (y no tiene que procesar una expresión regular). Más que eso, puede especificar un código en el 3xx serie:
return (301 | 302 | 303 | 307) url;
Si tiene un escenario en el que necesita validar la URL con una expresión regular o necesita capturar elementos en la URL original (que obviamente no están en una variable NGINX correspondiente), entonces debe usar rewrite
. Debes saber que rewrite
devuelve solo el código 301 o 302.
rewrite regex URL [flag];
Puede leer más sobre devolución y reescritura en el sitio web de NGINX.