Las reglas de reescritura de NGINX se utilizan para cambiar la totalidad o parte de la URL solicitada por un cliente. El motivo principal para cambiar una URL es informar a los clientes que los recursos que están buscando han cambiado su ubicación, además de controlar el flujo de ejecución de páginas en NGINX. Las directivas returny rewriteen NGINX se utilizan para reescribir la URL. Ambas directivas realizan la misma función de reescribir la URL. Sin embargo, la directiva rewrite es más poderosa que la directiva return, ya que la reescritura compleja que requiere el análisis de la URL se puede realizar solo con la directiva rewrite. En este tutorial, exploraremos cómo se utilizan las directivas return y rewrite en NGINX para cambiar o reescribir la URL.
Directiva de retorno de NGINX
La forma más sencilla y clara de reescribir una URL se puede realizar mediante la directiva de retorno. La directiva de retorno debe declararse en el contexto de ubicaciónserver o especificando la URL a la que se redirigirá.
1. Directiva de retorno de NGINX en el contexto del servidor
La directiva de retorno en el contexto del servidor es muy útil en una situación en la que ha migrado su sitio a un nuevo dominio y desea redirigir todas las URL antiguas al nuevo dominio. Además, también ayuda en la canonización de la URL al obligar a su sitio a redirigir a la versión www o no www.
server { listen 80; server_name www.olddomain.com; return 301 $scheme://www.newdomain.com$request_uri;}
La directiva de retorno en el contexto del servidor anterior redirige la URL destinada al sitio www.olddomain.coma www.newdomain.com. Tan pronto como NGINX recibe una URL con www.olddomain.com , deja de procesar la página y envía un código de respuesta 301 junto con la URL reescrita al cliente. Las dos variables utilizadas en la directiva de retorno anterior son $schemey $request_uri. La variable $schemese utiliza para definir el esquema de la URL (http o https) y la variable $request_uricontiene la URI completa con parámetros, si los hay. Recuerde que ambas variables obtienen esta información de la URL de entrada mientras reescriben la URL.
2. Directiva de retorno en contexto de ubicación
En algunas situaciones, es posible que desee redirigir páginas en lugar de redirigir dominios. La directiva de retorno dentro del bloque de ubicación le permite redirigir páginas específicas a una nueva ubicación.
location = /tutorial/learning-nginx { return 301 $scheme://example.com/nginx/understanding-nginx}
En el ejemplo anterior, siempre que una URI de solicitud coincida exactamente con el patrón /tutorial/learning-nginx, NGINX la redireccionará a la nueva ubicación . También puede redireccionar todo lo que corresponda a una ruta específica a una nueva ubicación. El siguiente ejemplo muestra cómo redireccionar todas las páginas a https://example.com/nginx/understanding-nginx/las que pertenece ./tutorialhttps://example.com/articles
location /tutorial { return 301 $scheme://example.com/articles}
Directiva de reescritura de NGINX
También podemos utilizar la directiva rewrite para reescribir la URL en NGINX. Al igual que la directiva return, la directiva rewrite también se puede colocar en el contexto del servidor y en el contexto de la ubicación. La directiva rewrite puede realizar distinciones complicadas entre URL y recuperar elementos de la URL original que no tienen variables NGINX correspondientes, lo que la hace más útil que la directiva return. La sintaxis de la directiva rewrite es:
rewrite regex replacement-url [flag];
- regex : la expresión regular basada en PCRE que se utilizará para comparar con la URI de solicitud entrante.
- replacement-url : si la expresión regular coincide con la URI solicitada, se utiliza la cadena de reemplazo para cambiar la URI solicitada.
- bandera : el valor de la bandera decide si es necesario o no algún procesamiento adicional de la directiva de reescritura.
Recuerde, la directiva de reescritura solo puede devolver el código 301 o 302. Para devolver otros códigos, debe incluir una directiva de retorno explícitamente después de la directiva de reescritura.
Ejemplos de directivas de reescritura de NGINX
Revisemos rápidamente algunas reglas de reescritura para ayudarlo a comenzar a reescribir una página HTML simple en otra URL:
1. Reescribir la página estática
Considere un escenario en el que desea reescribir una URL para una página, por ejemplo https://example.com/nginx-tutorial. https://example.com/somePage.htmlLa directiva de reescritura para hacer lo mismo se proporciona en el siguiente bloque de ubicación.
server { ... ... location = /nginx-tutorial { rewrite ^/nginx-tutorial?$ /somePage.html break; } ... ...}
Explicación:
-
La directiva de ubicación
location = /nginx-tutorialnos dice que el bloque de ubicación solo coincidirá con una URL que contenga el prefijo exacto que es/nginx-tutorial. -
NGINX buscará el patrón
^/nginx-tutorial?$en la URL solicitada. -
Para definir el patrón se utilizan los caracteres ^,? y $ y tienen un significado especial.
-
^ representa el comienzo de la cadena que se va a comparar.
-
$ representa el final de la cadena que debe coincidir.
-
? representa un modificador no codicioso. El modificador no codicioso dejará de buscar un patrón una vez que se haya encontrado una coincidencia.
-
Si la URI solicitada contiene el patrón anterior, se utilizará somePage.html como reemplazo.
-
Dado que la regla de reescritura finaliza con un salto, la reescritura también se detiene, pero la solicitud reescrita no se pasa a otra ubicación.
2. Reescribir la página dinámica
Ahora, considere una página dinámica https://www.example.com/user.php?id=11donde la parte dinámica es id=11(userid). Queremos que la URL se reescriba a https://exampleshop.com/user/11. Si tiene 10 usuarios, entonces se necesitan 10 reglas de reescritura para cada usuario si sigue el último método de reescritura de URL. En cambio, es posible capturar elementos de la URL en variables y usarlos para construir una única regla de reescritura que se ocupará de todas las páginas dinámicas.
server { ... ... location = /user.php { rewrite user.php?id=$1 ^user/([0-9]+)/?$ break; } ... ...}
Explicación:
- La directiva de ubicación
location = /userle dice a NGINX que haga coincidir el bloque de ubicación con una URL que contenga el prefijo exacto que es/user. - NGINX buscará el patrón
^user/([0-9]+)/?$en la URL solicitada. - La expresión regular entre corchetes [0-9]+ contiene un rango de caracteres entre 0 y 9. El signo + indica que coincide con uno o más de los caracteres anteriores. Sin el signo +, la expresión regular anterior coincidirá con solo 1 carácter, como 5 u 8, pero no con 25 o 44.
- El paréntesis ( ) en la expresión regular hace referencia a la referencia anterior. El $1 en la URL de reemplazo
user.php?id=$1hace referencia a esta referencia anterior.
Por ejemplo, si https://www.example.com/user/24es la URL de entrada, entonces el ID de usuario 24 coincidirá con el rango en la referencia inversa, lo que dará como resultado la siguiente sustitución: https://www.example.com/user.php?id=24
3. Reescritura avanzada de URL
Procedamos con otro ejemplo en el que queremos que la URL https://www.example.com/user.php?user_name=johnse reescriba como https://www.example.com/user/login/john. A diferencia de la regla de reescritura anterior, la parte dinámica de la URL user_name=johnahora contiene un rango de caracteres alfabéticos. La regla de reescritura para este escenario se muestra a continuación:
server { ... ... location = /user.php { rewrite user.php?user_name=$1 ^user/login/([a-z]+)/?$ break; } ... ... }
Explicación:
- La directiva de ubicación
location = /user/login/johnle dice a NGINX que haga coincidir el bloque de ubicación con una URL que contenga el prefijo exacto que es/user/login/john. - NGINX buscará el patrón
^user/login/([a-z]+)/?$en la URL solicitada. - La expresión regular entre corchetes [az]+ contiene un rango de caracteres entre a y z. El signo + significa que coincide con uno o más de los caracteres anteriores. Sin el signo +, la expresión regular anterior coincidirá con solo un carácter, como a o c, pero no con john o doe.
- El paréntesis ( ) en la expresión regular hace referencia a la referencia anterior. El $1 en la URL de reemplazo
user.php?user_name=$1hace referencia a esta referencia anterior.
Por ejemplo, si la URL de entrada es https://www.example.com/user/login/john“john”, el nombre de usuario coincidirá con el rango en la referencia inversa, lo que dará como resultado la siguiente sustitución: https://www.example.com/user.php?user_name=john
4. Reescribir con múltiples referencias anteriores
En este ejemplo, también descubriremos cómo reescribir una URL mediante múltiples referencias inversas. Supongamos que la URL de entrada es https://example.com/tutorial/linux/wordpress/file1y queremos reescribirla como https://example.com/tutorial/linux/cms/file1.php. Si observa detenidamente la URL de entrada, comienza con /tutorial, y en algún lugar más adelante en la ruta, la cadena wordpress debe reemplazarse por la cadena cms. Además, también debe agregarse una extensión de archivo (php) al final del nombre de archivo. La regla de reescritura para este escenario se detalla a continuación:
server { ... ... location /tutorial { rewrite ^(/tutorial/.*)/wordpress/(w+).?.*$ $1/cms/$2.php last; } ... ... }
Explicación:
- La primera referencia posterior
^(/tutorial/.*)en la expresión regular utilizada para hacer coincidir cualquier URL de entrada que comience con/tutorial/foo - La segunda referencia posterior
(w+)se utiliza para capturar solo el nombre del archivo sin extensión. - Las dos referencias anteriores se utilizan en la URL de reemplazo utilizando $1 y $2
- La última palabra clave le indica a NGINX que deje de analizar más condiciones de reescritura, ¡incluso en la próxima coincidencia de ubicación!
Resumen
Ahora puede reescribir la URL utilizando la directiva rewrite o return. Los ejemplos de reescritura utilizados en este tutorial son simples y fáciles de entender. ¡Ahora puede continuar escribiendo reglas de reescritura más complejas!