Agregue barras al final de cada url (necesita una regla de reescritura para nginx)

Intento obtener un “/” para cada final de urls:

example.com/art

debería

example.com/art/

Yo uso nginx como servidor web.

Necesito la regla de reescritura para esto …

Para una mejor comprensión, comprueba esto:

http://3much.schnickschnack.info/art/projekte

Si presiona sobre una miniatura pequeña debajo de la imagen grande, vuelve a cargar y muestra esta url:

http://3much.schnickschnack.info/art/projekte/#0

Si ahora tengo una barra en todas las direcciones URL (al final) funcionaría sin una recarga del sitio.

En este momento tengo esta configuración en nginx-http.conf:

server { listen *:80; server_name 3much.schnickschnack.info; access_log /data/plone/deamon/var/log/main-plone-access.log; rewrite ^/(.*)$ /VirtualHostBase/http/3much.schnickschnack.info:80/2much/VirtualHostRoot/$1 last; location / { proxy_pass http://cache; } } 

¿Cómo configuro nginx para agregar una barra inclinada? (Creo que debería una regla de reescritura?)

Es más probable que piense que desearía algo como esto:

 rewrite ^([^.]*[^/])$ $1/ permanent; 

La expresión regular se traduce en: “reescribir todos los URI sin ninguno”. en ellos que no terminan con un ‘/’ al URI + ‘/’ “O simplemente:” Si el URI no tiene un punto y no termina con una barra inclinada, agregue una barra inclinada hasta el final ”

La razón por la que solo se reescriben los URI sin puntos en ellos hace que todo archivo con una extensión de archivo no se vuelva a escribir. Por ejemplo, sus imágenes, css, javascript, etc. y previenen posibles bucles de redirección si usa algún framework php que también haga sus propias reescrituras.

Otra reescritura común para acompañar esto sería:

 rewrite ^([^.]*)$ /index.php; 

Esto simplemente reescribe todos los URI que no tienen puntos en ellos en su index.php (o en cualquier archivo desde el que ejecute su controlador).

 rewrite ^([^.\?]*[^/])$ $1/ permanent; 

para evitar querystrings de un URL de reposo reciba / etiquetado.

p.ej

/ myrest / do? d = 12345

Para nginx:

 rewrite ^(.*[^/])$ $1/ permanent; 

utilizando las reescrituras de anthonysomerset en WordPress, experimenté problemas al acceder al panel / wp-admin debido al bucle de re-dirección. Pero resuelvo este problema usando el condicional anterior:

 if ($request_uri !~ "^/wp-admin") { rewrite ^([^.]*[^/])$ $1/ permanent; rewrite ^([^.]*)$ /index.php; } 
 server { # ... omissis ... # put this before your locations rewrite ^(/.*[^/])$ $1/ permanent; # ... omissis ... } 

Si desea que se evite algún tipo de solicitud (por ejemplo, distinta a GET ) (generalmente se trata de solicitudes POST , ya que rewrite convierte cualquier método de solicitud en GET , lo que puede interrumpir parte de la funcionalidad dinámica de su sitio), agregue un cláusula:

 server { # ... omissis ... # put this before your locations if ($request_method = "GET" ) { rewrite ^(/.*[^/])$ $1/ permanent; } # ... omissis ... } 

También puede poner la rewrite en un bloque de location ( if también), para hacerlo más específico.

Es extraño que este sea el primer resultado en Google, pero no tiene una respuesta satisfactoria. Hay dos buenas maneras de hacer esto, lo sé. El primero es verificar directamente si la solicitud golpeará un archivo y solo aplicará una condición de reescritura si no es así. P.ej

 server { # ... if (!-f $request_filename) { rewrite [^/]$ $uri/ permanent; } location / { # CMS logic, eg try_files $uri $uri /index.php$request_uri; } # ... } 

El segundo, que muchos prefieren ya que prefieren evitar el uso si no es 100% necesario, es usar try_files para enviar la solicitud a un bloque de ubicación con nombre cuando no llegue a un archivo. P.ej

 server { # ... location / { try_files $uri $uri/ @cms; } location @cms { rewrite [^/]$ $uri/ permanent; # CMS logic, eg rewrite ^ /index.php$request_uri; } # ... } 

es demasiado tarde pero quiero compartir mi solución, he encontrado un problema con la barra inclinada y nginx.

 #case : # 1. abc.com/xyz => abc.com/xyz/ # 2. abc.com/xyz/ => abc.com/xyz/ # 3. abc.com/xyz?123&how=towork => abc.com/xyz/?123&how=towork # 4. abc.com/xyz/?123&ho=towork => abc.com/xyz/?123&how=towork 

y esta es mi solución

 server { .... # check if request isn't static file if ($request_filename !~* .(gif|html|jpe?g|png|json|ico|js|css|flv|swf|pdf|xml)$ ) { rewrite (^[^?]+[^/?])([^/]*)$ $1/$2 permanent; } .... location / { .... } } 

Si nginx detrás del proxy con https, este fragmento corrige el redireccionamiento de $scheme

 map $http_x_forwarded_proto $upstream_scheme { "https" "https"; default "http"; } server { ... location / { rewrite ^([^.\?]*[^/])$ $upstream_scheme://$http_host$1/ permanent; } ... } 

Y en el proxy ascendente pase el encabezado X-Forwarded-Proto como:

 location / { proxy_set_header X-Forwarded-Proto $scheme; ... } 

Pruebe esto: ^(.*)$ http://domain.com/$1/ [L,R=301]

Esto redirige (código de estado 301) todo ($ 1) sin un “/” a “$ 1 /”