2009-03-14 18 views
37

trato de obtener una "/" para todas las direcciones URL final:Añadir barra diagonal al final de cada URL (es necesario reescribir regla para nginx)

example.com/art

debe

ejemplo .com/art/

Uso nginx como servidor web.

necesito la regla de reescritura para este ..

Para una mejor comprensión de este cheque:

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

Si u presione sobre una pequeña miniatura bajo el cuadro grande se vuelven a cargar y muestra la siguiente URL:

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

Si ahora tengo una barra en todas las direcciones URL (en el extremo) que wo uld trabajo sin una recarga del sitio.

En este momento tengo esta configuración de 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 se configura nginx para agregar una barra? (Creo que debería una regla de reescritura?)

+0

Um ... ¿Por qué quieres a/en el th eend de todas sus URL? – cletus

+0

¿Cuál es la pregunta? –

+0

Lo necesito para una galería js. Si no hay "/", vuelve a cargar el sitio ... – Gomez

Respuesta

-3

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

Esto redirige (código de estado 301) todo ($ 1) sin una "/" a "$ 1 /"

+0

Su estado no es 301. – Gomez

+0

Gomez: Debe absolutamente 301 (redirigir) la URL no cortada a la reducida, o los motores de búsqueda, y verá example.com/blah y example.com/blah/ como dos completamente separados páginas – dbr

+0

Acabo de probar esto.^(. *) $ redirige todo independientemente. Tuve que usar^(. *) [^ /] En su lugar, por lo que solo redirige si no hay una barra final. – Chris

9

Para Nginx:

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

Esto agregará una barra inclinada a TODO, por lo que terminará con index.php -> index.php /, y page? A = b -> page? A = b/donde lo que el OP seguramente quiere es page? A = b -> page /? a = b – Benubird

75

lo más probable es que creo que usted quiere algo como esto:

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

La Regla La expresión lar 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 reescriba. Por ejemplo, su imágenes, CSS, JavaScript, etc., y evitar la posibilidad de redireccionamiento bucles si se utiliza algún tipo de marco php que hace sus propios reescrituras también

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

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

Esta muy simple reescribe todos los URI que no tienen períodos en ellos en su index.php (o en cualquier archivo desde el que ejecute su controlador).

+1

Esta es la única publicación en las interwebs que no agrega una barra inclinada a TODO. gracias por publicar. – ansiart

+0

este funciona de manera mucho más fiable, particularmente con frameworks php que tienen una bonita reescritura de enlaces – anthonysomerset

+0

Tengo archivos html estáticos así que esto: ** http: //domain.com/about** obtiene el archivo ** http: // domain .com/about.html ** pero aún muestra la URL sin ".html". Estoy buscando agregar una barra después de presionar el archivo, pero obtengo un 404 ahora si agrego una barra inclinada. Así que quiero eliminar la barra diagonal (si existe) y con o sin barra diagonal se obtiene el archivo "-html" pero muestra "/" después.Esto no funciona: '' reescribir ^/([a-zA-Z0-9] +) $ /$1.html; reescribir^([^.] * [^ /]) $ $ 1/permanente; '' También para hacer clic en "sobre" en un menú varias veces obtengo esto ** http: //domain.com/about/ about/about/** etc .. – Asle

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

para evitar cadenas de consulta de una URL resto conseguir un/etiquetada sucesivamente.

p. Ej.

/myrest/do?d = 12345

+0

cómo podría usted hacer el resultado '' ' /myrest/do /? D = 12345 ' '' –

1

usando las reescrituras de anthonysomerset en Wordpress, experimenté problemas al acceder al tablero/wp-admin debido al bucle de re-dirección. Pero puedo solucionar este problema mediante los métodos anteriores condicional:

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

    # put this before your locations 
    rewrite ^(/.*[^/])$ $1/ permanent; 

    # ... omissis ... 
} 

Si desea algún tipo de peticiones (dicen que no sea GET unos) para ser impedido de hacer esto (por lo general es aproximadamente POST peticiones, como rewrite vueltas cualquier método de solicitud en GET, que puede romper algunas de funcionalidad dinámica de su sitio), añadir una cláusula if:

server { 
    # ... omissis ... 

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

    # ... omissis ... 
} 

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

0

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 esto 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/{ 
    .... 
    } 
} 
0

extraño que este es el primer resultado de 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, e.g. try_files $uri $uri /index.php$request_uri; 
    } 
    # ... 
} 

La segunda, que muchos prefieren ya que prefiere evitar cualquier uso de si eso no es 100% necesario, es utilizar try_files para enviar la solicitud a un bloque de ubicación con nombre cuando ganó' t golpea un archivo. P.ej.

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