2009-03-14 6 views
37

cerco di ottenere un "/" per ogni fine gli URL:Aggiungere barra alla fine di ogni url (necessario riscrivere regola per nginx)

example.com/art

dovrebbe

esempio .com/art/

Io uso nginx come server web.

ho bisogno della regola di riscrittura per questo ..

Per una migliore comprensione di controllo questo:

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

Se u premere su una piccola miniatura sotto il quadro generale si ricarica e mostra questo URL:

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

Se ora ho una barra su tutti gli URL (alla fine) si wo uld funzionare senza ricaricare il sito.

Proprio ora ho questa impostazioni in 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; 
    } 
} 

Come faccio a configurare nginx aggiungere una barra? (Penso che dovrei una regola di riscrittura?)

+0

Ehm ... perché vorresti un/a prima di tutti i tuoi URL? – cletus

+0

Qual è la domanda? –

+0

Ne ho bisogno per una galleria js. Se non c'è "/" ricarica il sito ... – Gomez

risposta

-3

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

Questo reindirizza (codice di stato 301) tutto ($ 1) senza un "/" per "$ 1 /"

+0

Lo stato non è 301. – Gomez

+0

Gomez: Devi assolutamente 301 (reindirizzare) l'URL non ridotto a quello barrato, o motori di ricerca e tale vedrà esempio.com/blah ed esempio.com/blah/ come due completamente separati pagine – dbr

+0

Ho appena provato questo.^(. *) $ reindirizza tutto indipendentemente. Ho dovuto usare^(. *) [^ /] Invece, quindi reindirizza solo se non c'è una barra finale. – Chris

9

Per nginx:

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

Questo aggiungerà una barra ad OGNI COSA - quindi finirai con index.php -> index.php /, e pagina? A = b -> pagina? A = b/dove ciò che l'OP vuole sicuramente è la pagina? A = b -> page /? a = b – Benubird

75

Più probabilmente credo che si vorrebbe qualcosa di simile:

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

La regola lar Expression si traduce in: "riscrivere tutti gli URI senza". " in essi che non terminano con un '/' nell'URI + '/' " o semplicemente: " Se l'URI non ha un punto e non termina con una barra, aggiungi una barra alla fine "

La ragione per la sola riscrittura degli URI senza punti in essi rende così qualsiasi file con un'estensione di file non viene riscritto. Per esempio il vostro immagini, CSS, JavaScript, ecc e prevenire possibili redirect loop Se si utilizza un framework PHP che fa proprie riscritture anche

Un'altra riscrittura comune per accompagnare questo sarebbe:

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

Questo riscrive in modo molto semplice tutti gli URI che non hanno periodi al loro index.php (o qualsiasi altro file dal quale si eseguirà il controller).

+1

Questo è l'unico post dell'interwebs che non aggiunge una barra finale a TUTTO. grazie per la pubblicazione – ansiart

+0

questo funziona in modo molto più affidabile in particolare con i framework php che possiedono la riscrittura del link piuttosto bella – anthonysomerset

+0

Ho file html statici in questo modo: ** http: //domain.com/about** ottiene il file ** http: // domain .com/about.html ** ma mostra ancora l'URL senza ".html". Sto cercando di aggiungere una barra dopo che ho colpito il file, ma ora ottengo un 404 se aggiungo una barra. Quindi voglio rimuovere la barra finale (se esiste) e con o senza barra finale ottiene il file "-html" ma mostra "/" dopo.Questo non funziona: '' riscrivi ^/([a-zA-Z0-9] +) $ /$1.html; riscrittura^([^.] * [^ /]) $ $ 1/permanente; '' Anche per fare clic su "circa" in un menu volte più volte ho questo ** http: //domain.com/about/ circa/about/** etc .. – Asle

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

per evitare che querystring di un indirizzo di riposo venga inserito/taggato.

ad es.

/myrest/do?d = 12345

+0

come si può ottenere il risultato '' ' /myrest/do /? D = 12345 ' '' –

1

utilizzando le riscritture da anthonysomerset in un Wordpress, ho sperimentato problemi di accesso al dashboard/wp-admin a causa del ciclo di reindirizzamento. Ma posso risolvere questo problema utilizzando il sopra condizionale:

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

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

    # ... omissis ... 
} 

Se volete qualche tipo di richieste (dire altro che GET quelli) per essere impedito di fare questo (di solito è circa POST richieste, come rewrite giri qualsiasi metodo di richiesta in GET, che può rompere alcune delle funzionalità dinamiche del sito), aggiungere una clausola di if:

server { 
    # ... omissis ... 

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

    # ... omissis ... 
} 

si può anche mettere il rewrite in un blocco location (if), per renderlo più specifico.

0

è troppo tardi ma voglio condividere la mia soluzione, ho riscontrato problemi con la barra finale e 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 

e questa è la mia soluzione

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

Strano che questo è il primo risultato di Google, ma non ha una risposta soddisfacente. Ci sono due buoni modi per farlo, lo so. Il primo è quello di verificare se la richiesta colpirà un file e, in caso contrario, applicherà solo una condizione di riscrittura. Per esempio.

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

Il secondo, che molti preferiscono in quanto preferisce evitare qualsiasi utilizzo di se che non è necessario al 100%, è quello di utilizzare try_files per inviare la richiesta ad un blocco posizione denominata quando ha vinto' t premere un file. Per esempio.

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