2014-03-06 10 views
9

Ich bin ziemlich neu bei Nginx, also bitte, ertragen Sie mit mir.Nginx leitet alle Anfragen von einem Unterverzeichnis in ein anderes Unterverzeichnis um. Root

Ich versuche, alle Anfragen von einem Unterverzeichnis (Store) auf den Stamm eines anderen Unterverzeichnisses (Handel) umzuleiten. Sehen Sie meinen Fortschritt unten. Die Site im Ziel-Unterverzeichnis (trade) ist eine Magento-Site, also sind das die meisten der aktuellen Regeln.

server { 
    server_name example.com *.example.com; 
    root /usr/share/nginx/html/example.com/public_html; 
    index index.php index.html index.htm; 

    access_log /var/log/nginx/example.access.log; 
    error_log /var/log/nginx/example.error.log; 

    location/{ 
      try_files $uri $uri/ /index.html; 
    } 

    location /trade/ { 
      index index.html index.php; 
      try_files $uri $uri/ @handler; 
      expires 30d; 
    } 

    location ~ /store { 
      rewrite /trade permanent; 
    } 

    location ~ ^/trade/(app|includes|lib|media/downloadable|pkginfo|report/config.xml|var)/ { internal; } 
    location /trade/var/export/ { internal; } 
    location /. { return 404; } 
    location @handler { rewrite//trade/index.php; } 

    error_page 404 /404.html; 

    error_page 500 502 503 504 /50x.html; 
    location = /50x.html { 
      root /usr/share/nginx/html; 
    } 

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 
    location ~ \.php$ { 
      try_files $uri =404; 
      fastcgi_pass unix:/var/run/php5-fpm.sock; 
      fastcgi_index index.php; 
      fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 
      include fastcgi_params; 

    } 


} 

Der Abschnitt I umleiten bin mit ist die folgende:

location ~ /store { 
     rewrite /trade permanent; 
} 

Dies funktioniert für example.com/store aber nicht example/store/index.php oder andere uri mit args. Ich habe das Gefühl, dass der PHP-Datei-Abschnitt unten die Verarbeitung überschreibt. Deshalb habe ich den ~ vor den Ladenort gestellt, wie die Dokumentation here besagt, dass dies zuerst verarbeitet wird. Stoppen oder weitermachen?

Ich habe über das Verschachteln einer PHP-Regel gelesen, aber ich habe das vergeblich versucht.

Ich würde jede Hilfe sehr schätzen.

+0

welche Art von Argumenten? –

+0

Eine Beispiel-URL wäre http://www.example.com/store/index.php?page=shop.product_details&flypage=flypage.tpl&category_id=365&product_id=8025&option=com_virtuemart&Itemid=101 – user1214769

Antwort

3

Ok,

Kommen zu dieser zurück kann ich das Problem sehen.

In Nginx, wenn Sie eine Location-Direktive mit ~ voranstellen, bedeutet dies, dass Sie reguläre Ausdrücke in Ihrer Direktive verarbeiten wollen (Groß-/Kleinschreibung beachten, ~ * für Groß-/Kleinschreibung beachten). Ich glaube, dass alle Regex-Direktiven vor allen anderen verarbeitet werden, aber ich werde korrigiert werden.

Also, wenn ich verwende:

location ~/store { 
     rewrite /trade permanent; 
} 

Es gibt keine regex gibt. Es ist einfach anzupassen/speichern und Weiterleiten an den Handel.

Nach einigen Nachforschungen (und dem Auffrischen meiner Regex, was Unsinn ist), kam ich zurück und habe mir eine funktionierende Lösung einfallen lassen.

location ~ ^/store/(.*) { 
      rewrite ^/store(.*) /trade permanent; 
    } 

Hier habe ich die Richtlinie werde fragen die Regex durch Eingabe ~ dann passen jede URL mit/store/in, sie zu verarbeiten.

Dann die Dokumentation nach, die Rewrite-Syntax:

Rewrite regex Ersatz [flag]

so bin ich alle URLs mit Speicher in es passend und sie in den neuen Unterordner permanent umgeleitet wird.

Ziemlich einfach wirklich, peinlich so eigentlich, aber hey, jeden Tag ist ein Schultag. Ich bin offen für Korrekturen und hoffe, dass es jemandem hilft.

30

ok versuchen so etwas wie dieses

location ^~ /store(.*) { 
    return 301 $scheme://$http_host/trade$1$is_args$query_string; 
} 

Der Versuch, hartkodierte Sachen so viel wie möglich zu vermeiden und mit Rückkehr weil it's prefered over permanent rewrites

+3

Danke für die Antwort, ich würde Sie abstimmen aber ich habe den Ruf nicht! – user1214769

+1

Es ist in Ordnung, mach dir keine Sorgen: - D –

+1

Ich musste '~ *' verwenden, um dies zum Funktionieren zu bringen, z. 'location ~ * /store(.*) {...}' – fideloper

0

Sie müssen sicherstellen, dass Ihre location ~ \.php$ Handler nehmen keine URLs unter dem alten Mappe.In der Tat sind Präzedenzregeln innerhalb von http://nginx.org/r/location eindeutig dokumentiert, und Sie können entweder reguläre Ausdrücke verwenden oder noch besser einen Präfix-basierten Matching mit dem Modifizierer ^~, um anzuweisen, dass die Suche stoppen muss, ohne zu sehen, ob das Regex-basierte \.php$ passen würde:

location ^~ /old/long/path/ { # will match /old/long/path/index.php, too 
     rewrite ^/old/long/path/(.*)$ /new/$1 permanent; 
    } 

das Skript ist wahrscheinlich die effizienteste Art und Weise, dies zu tun, aber hier ist eine andere Möglichkeit, das gleiche zu tun:

location ~ /old/long/path/(.*) { 
     return 301 /new/$1$is_args$args; 
    } 

Warum ein Beispiel $is_args$args und das andere hat nicht? Gute Frage! Beachten Sie, dass die location Direktive sowie der erste Parameter der rewrite Direktive beide basierend auf dem Inhalt der $uri Variable arbeiten, im Gegensatz zu $request_uri. Lange Rede, kurzer Sinn, aber $uri enthält keine $args, so dass in beiden Fällen $1 keine args enthalten wird; Im Fall von rewrite wird der Fall jedoch so häufig angenommen, dass $args automatisch von nginx hinzugefügt werden, es sei denn, die neue Zeichenfolge endet mit einem ? Zeichen, siehe http://nginx.org/r/rewrite.

Verwandte Themen