Cómo redirigir URLs con una barra diagonal al final hacia la variante sin barra (con excepciones)?
Tengo algunos problemas para configurar NGINX para que todas las URL con una barra diagonal (/) al final redirijan permanentemente a la variante sin una barra. El problema es que esta directiva debe suceder para todas las URL excepto aquellas que comienzan con /backend
.
Por ejemplo:
https://example.com/service/ --> https://example.com/service
https://example.com/service/one/ --> https://example.com/service/one
https://example.com/backend/ --> https://example.com/backend/ (no deve redirigir)
Actualmente estoy usando esta directiva:
server {
listen 80;
listen 443 ssl http2;
[…]
location ~ ^/(?!backend)(.+)/$ {
return 301 $1$is_args$args;
}
[…]
}
Desafortunadamente, aquí ocurre el siguiente error:
https://example.com/service/ --> https://example.com/service/service
¿Alguien puede ayudarme a resolver este misterio de regex?
davy.ai
El problema con la expresión regular actual es que captura toda la ruta de la URL, y luego la variable
$1
en la directivareturn
incluye la ruta capturada. Esto provoca el segmento extra/service
en la URL de redireccionamiento.Para solucionar esto, podemos modificar la expresión regular para capturar solo la parte de la ruta antes de la barra diagonal final, mediante el uso de un grupo de captura
()
alrededor de.+
y excluyendo el carácter de la barra diagonal con[^/]
. La expresión regular modificada se vería así:Con esta expresión regular, solo se capturará la parte de la ruta antes de la barra diagonal final, por lo que las url de redireccionamiento no incluirán ningún segmento de ruta extra.
Ejemplo de configuración probada: