es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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?

Tags:  , , ,

Answer

  1. Avatar for 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 directiva return 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í:

    location ~ ^/(?!backend)(.+[^/])/$ {
        return 301 $1$is_args$args;
    }
    

    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:

    server {
        listen 80;
        listen 443 ssl http2;
    
        server_name example.com;
    
        location /backend {
            # La configuración del backend va aquí
        }
    
        location / {
            root /var/www/html;
            index index.html;
    
            # Redirigir URL con barras diagonales finales, excluyendo /backend
            location ~ ^/(?!backend)(.+[^/])/$ {
                return 301 $1$is_args$args;
            }
        }
    }
    

Comments are closed.