¿Cómo eliminar la barra doble en las URL servidas por nginx?

9

Necesito replicar las siguientes reglas de reescritura de Apache en la configuración de Nginx en Ubuntu 12.04. ¿Cuál es el nginx equivalente a:

RewriteCond %{REQUEST_URI} ^(.*)//(.*)$
RewriteRule . %1/%2 [R=301,L]
codecowboy
fuente
Quien encuentre esto en línea e intente copiar y pegar las respuestas sugeridas, tenga cuidado si está utilizando una configuración de Virtualbox con puertos personalizados. Tuve que cambiarlo para que sea, por ejemplo, rewrite (.*)//+(.*) $scheme://$host:4321$1/$2 permanent;donde 4321 es el puerto externo de Virtualbox'd nginx al que se conecta mi navegador.
aexl

Respuestas:

6

Me gustaría sugerir este enfoque:

# remove multiple sequences of forward slashes
# rewrite URI has duplicate slashes already removed by Nginx (merge_slashes on), just need to rewrite back to current location
# note: the use of "^[^?]*?" avoids matches in querystring portion which would cause an infinite redirect loop
if ($request_uri ~ "^[^?]*?//") {
rewrite "^" $scheme://$host$uri permanent;
}

Utiliza el comportamiento predeterminado de nginx: fusión de barras, por lo que no es necesario reemplazar las barras, simplemente redirigimos

encontrado aquí

Sonámbulo
fuente
Esto no funciona para SSL a través de certbot si tiene nginx como proxy inverso a través de proxy_pass
Jonathan
3

Encontré la respuesta de kwo a no funcionar. Mirando mi registro de depuración, esto es lo que sucede:

2014/08/18 15:51:04 [debug] 16361#0: *1 http script regex: "(.*)//+(.*)"
2014/08/18 15:51:04 [notice] 16361#0: *1 "(.*)//+(.*)" does not match "/contact-us/", client: 59.167.230.186, server: *.domain.edu, request: "GET //////contact-us//// HTTP/1.1", host: 
"test.domain.edu"

Encontré que esto funcionó para mí:

if ($request_uri ~* "\/\/") {
  rewrite ^/(.*)      $scheme://$host/$1    permanent;
}

Ref: http://rosslawley.co.uk/archive/old/2010/01/10/nginx-how-to-url-cleaning-removing/

DaveQB
fuente
El enlace de referencia es lo que necesita verificar. La solución correcta está ahí. Intentaré editar la respuesta.
Anup Nair
1

Prueba esto:

merge_slashes off;
rewrite (.*)//+(.*) $1/$2 permanent;

Puede haber múltiples redirecciones para barras> 3 o múltiples grupos de barras.

kwo
fuente
'merge_slashes off' no hizo ninguna diferencia y no resultó en ningún cambio.
Anup Nair
1
¿Por qué no merge_slashes on;solo funciona? ¿Es nginx buggy?
Jonathan
1
@ Jonathan - Acabo de encontrar esto también. Según tengo entendido, eso merge_slashes onno hace lo que estás pensando. Básicamente le dice a nginx que tome // y / y /// como una barra oblicua (no fusionar y redirigir por sí mismo)
Andrew Newby
1

Hablo por experiencia de ejecutar múltiples servidores de producción y servidores de desarrollo para un equipo. No hagas esto en nginx. En su lugar, use su enrutador dentro de su servidor de aplicaciones (JS / PHP, etc.).

Nginx no es confiable para el trabajo sustantivo. Por ejemplo, los redireccionamientos, reescrituras y ifcláusulas no son deterministas si cambia su configuración para usar SSL, un proxy inverso, puertos ocultos, etc. Por lo tanto, es posible que funcione correctamente en un entorno, pero podría ser imposible trabajar en otro.

Apéguese a un lenguaje de programación adecuado para resolver problemas, incluso tan simple como fusionar barras dobles. Me lo agradecerás más tarde.

Jonathan
fuente
Si bien estoy de acuerdo con su opinión, creo que deberíamos dar a las personas la opción de formarse su propia opinión sobre el asunto. Prefiero Apache a Nginx, por la misma razón que la tuya. Tenga en cuenta que Apache mod_rewrite también se puede considerar como un lenguaje de programación simple. :-)
peterh - Restablecer Monica
-1

URL example.com//dir1////dir2///dir3 y más Prueba esto, me está funcionando

merge_slashes off; ubicación ~ ^ (. *?) // + (. *?) $ {return 301 $ 1 / $ 2; }

SoniNow
fuente