Comportamiento extraño de Nginx con barras al final

1

Tengo un comportamiento bastante interesante. Quiero evitar las barras diagonales finales en las URL de mi sitio. He puesto una rewrite ^/(.*)/$ /$1 permanent;regla en el bloque de mi servidor, así que
https://example.com/something/,
https://example.com/something////
redirigir a
https://example.com/something;
y
https://example.com/
redirecciona a
https://example.com

Pero https://example.com////se redirige a ... https://enjoygifts.ru////(en realidad, no se redirige, es código 200). ¿Por qué?

Aquí está mi bloque de servidor:

    server {
        listen 443 ssl;
        ...
        ... ssl directives
        ...

        root        /var/www/mysite.com;
        index       index.php;
        server_name mysite.com;
        rewrite ^/(.*)/$ /$1 permanent;

        location / {
            rewrite ^/.*$ /index.php last;
        }

        location ~ ^/index.php {
            try_files    $uri =404;
            include      /etc/nginx/fastcgi.conf;
            fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
        }

        location ~ ^/storage/app/uploads/public { try_files $uri 404; }
        ...
        ... lot of similar location blocks
        ...
    }

1

https://example.comno existe realmente, el URI raíz es /- cómo se muestra en la barra de direcciones del navegador depende del navegador - algunos mostrarán automáticamente el solitario /mientras que otros eliminarán un solitario /.

Por lo tanto, no puede redirigir de https://example.com/a https://example.com; se interpretará silenciosamente como una redirección de https://example.com/a https://example.com/.

Nginx usa un URI normalizado al evaluar locationy rewritedeclaraciones y generar la $urivariable. Varias apariciones consecutivas de /se combinan en una sola /.

Aunque la expresión regular ^/(.*)/$coincide con el URI //, la declaración nunca la verá. Porque Nginx ya ha normalizado ese URI a /, que no coincide con la expresión regular.


Si un URI raíz con varios /s es un problema, aplique una expresión regular a la $request_urivariable, que contiene el URI original antes de la normalización y también incluye la cadena de consulta (si corresponde).

Por ejemplo:

if ($request_uri ~ "^/{2,}(\?|$)") { 
    return 301 /$is_args$args; 
}

Esto se puede colocar dentro de su location / {...}bloque. Consulte esta advertencia sobre el uso de if.

1
  • Gracias por tu respuesta. Ok, debido a la normalización de Nginx y las ^/(.*)/$expresiones regulares que podemos obtener /somethingde /something////( /something////-> /something/-> /something). Pero si ^/(.*)/$no puedo ver ////, ¿cómo se puede borrar ////de la barra de direcciones del navegador? Petr 6/11/18 a las 14:03