2009-03-14 5 views
37

Ich versuche, ein "/" zu jedem Urls Ende zu bekommen:hinzufügen slash zum Ende jeder URL (muss für Nginx Rewrite-Regel)

example.com/art

sollte

Beispiel .com/art/

Ich benutze Nginx als Webserver.

Ich brauche die Rewrite-Regel für diesen ..

Zum besseren Verständnis Check this:

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

Wenn u es neu geladen auf einem kleinen Thumbnail unter dem großen Bild drücken und zeigt diese URL:

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

Wenn ich jetzt einen Schrägstrich auf alle Urls (am Ende) haben es WO arbeiten ohne Neuladen der Site.

Im Moment habe ich diese Einstellungen 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; 
    } 
} 

Wie konfiguriere ich nginx einen Schrägstrich hinzufügen? (Ich glaube, ich sollte eine Rewrite-Regel?)

+0

Um ... warum möchten Sie ein/am Ende aller Ihrer URLs? – cletus

+0

Was ist die Frage? –

+0

Ich brauche es für eine js-Galerie. Wenn es kein "/" gibt, lädt es die Seite neu ... – Gomez

Antwort

-3

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

Diese Umleitungen (Statuscode 301) alles ($ 1) ohne "/" auf "$ 1 /"

+0

Es ist kein Status 301. – Gomez

+0

Gomez: Du solltest unbedingt die (nicht umzusteuernde) URL zu der aufgeschlitzten URL 301 umleiten, oder Suchmaschinen und so werden beispiel.de.com/blah und example.com/blah/ als zwei komplett voneinander getrennt angezeigt Seiten – dbr

+0

Ich habe das gerade getestet.^(. *) $ leitet alles unabhängig um. Ich musste stattdessen^(. *) [^ /] Verwenden, so dass es nur umgeleitet wird, wenn es keinen End-Schrägstrich gibt. – Chris

9

Für nginx:

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

Dies wird einen Schrägstrich zu ALLES hinzufügen - so dass Sie am Ende mit index.php -> index.php/und Seite? A = b -> Seite? A = b/wo was das OP sicherlich will ist Seite? A = b -> page /? a = b – Benubird

75

wahrscheinlicher ich glaube, Sie so etwas wie dies wünschen würde:

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

Die Regu lar Expression übersetzt sich in: "überschreiben Sie alle URIs ohne '." in denen, die nicht enden mit einem '/' zu dem URI + '/' " Oder einfach: " Wenn der URI keine Periode hat und nicht mit einem Schrägstrich endet, fügen Sie am Ende einen Schrägstrich hinzu "

Der Grund dafür, dass nur URIs ohne Punkte neu geschrieben werden, macht es so, dass jede Datei mit einer Dateierweiterung nicht neu geschrieben wird. Zum Beispiel Ihre Bilder, CSS, Javascript, etc. und verhindern mögliche Redirect-Loop, wenn einige PHP-Framework, das seine eigene umschreibt auch dies wäre zu begleiten

Ein weiteres gemeinsames Rewrite tut:

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

Diese sehr einfach umschreibt Alle URIs, die keine Punkte in ihrer index.php enthalten (oder in welcher Datei Sie Ihren Controller ausführen würden).

+1

Dies ist der einzige Eintrag in den Interwebs, der ALLES keinen nachgestellten Schrägstrich hinzufügt. danke fürs Schreiben. – ansiart

+0

dieser arbeitet viel zuverlässiger vor allem mit PHP-Frameworks, die dort hübsche Link Neuschreiben besitzen – anthonysomerset

+0

Ich habe statische HTML-Dateien, so dass dies: ** http: //domain.com/about** bekommt die Datei ** http: // Domäne .com/about.html ** zeigt aber immer noch die URL ohne ".html". Ich suche nach einem Schrägstrich, nachdem ich die Datei gefunden habe, aber ein 404 jetzt, wenn ich einen Schrägstrich hinzufügen. Also möchte ich den abschließenden Schrägstrich entfernen (falls vorhanden) und mit oder ohne Schrägstrich die "-html" -Datei erhält, aber "/" danach anzeigt.Dies funktioniert nicht: '' umschreiben ^/([a-zA-Z0-9] +) $ /$1.html; umschreiben^([^.] * [^ /]) $ $ 1/permanent; '' Auch für klicken Sie auf "über" in einem Menü severa mal ich bekomme diese http: //domain.com/about/ über/about/** etc .. – Asle

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

um Querystrings einer Resturl zu vermeiden, die ein/etikettiert werden.

z.B.

/myrest/tun?d = 12345

+0

Wie können Sie das Ergebnis '' ' /myrest/tun /? D = 12345 ' '' machen –

1

Mit den Umschreibungen von Anthonysomerset in einer Wordpress, experimentierte ich Probleme auf/wp-Admin-Dashboard aufgrund der Umleitung Schleife zugreifen. Aber ich dieses Problem lösen die oben bedingte Verwendung:

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

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

    # ... omissis ... 
} 

Wenn Sie irgendeine Art von Anfragen wollen (sagen, außer GET sind) zu tun, dies verhindert werden (in der Regel geht es um POST Anfragen, wie rewrite Wendungen jeder Antrag Verfahren in GET, die einige Ihrer Website dynamische Funktionalität brechen), fügen Sie eine if Klausel:

server { 
    # ... omissis ... 

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

    # ... omissis ... 
} 

Sie auch diesetzen könnenin einem location Block (if auch), um es genauer zu machen.

0

es ist zu spät, aber ich möchte meine Lösung teilen, ich habe Problem mit Schrägstrich und Nginx getroffen.

#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 

und dies ist meine Lösung

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

Odd, dass dies das erste Ergebnis in Google, aber keine befriedigende Antwort. Es gibt zwei gute Möglichkeiten, dies zu tun, von denen ich weiß. Die erste besteht darin, direkt zu prüfen, ob die Anfrage eine Datei trifft und nur eine Umschreibbedingung anwendet, wenn nicht. Z.B.

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

Die zweite, die viele bevorzugen, da sie eher jegliche Verwendung von wenn vermeiden würden, das nicht zu 100% erforderlich ist, ist try_files zu verwenden, um die Anfrage zu einem benannten Stelle Block zu senden, wenn es gewonnen t hit eine Datei. Z.B.

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