it-swarm.com.de

Nginx leitet alle Anforderungen vom Unterverzeichnis an ein anderes Unterverzeichnis root um

Ich bin zu Nginx ziemlich neu, also bitte ertragen Sie mich. 

Ich versuche, alle Anforderungen von einem Unterverzeichnis (Geschäft) an das Stammverzeichnis eines anderen Unterverzeichnisses (Handel) umzuleiten. Siehe meinen Fortschritt unten. Die Site im Ziel-Unterverzeichnis (Trade) ist eine Magento-Site, für die die meisten der aktuellen Regeln gelten.

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, den ich zum Umleiten verwende, ist folgender:

location ~ /store {
        rewrite /trade permanent;
}

Dies funktioniert für example.com/store, aber nicht example/store/index.php oder andere uri mit Argumenten. Ich habe das Gefühl, dass der PHP-Dateibereich unten die Verarbeitung überschreibt. Aus diesem Grund habe ich das ~ vor die Ladenlokalität gestellt, als Dokumentation hier wird angegeben, dass diese zuerst bearbeitet wird. Wird die Verarbeitung angehalten oder fortgesetzt? 

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

Ich würde mich über jede Hilfe sehr freuen.

10
user1214769

ok probiere so etwas

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

Versuchen Sie, hartcodierte Dinge so weit wie möglich zu vermeiden, und verwenden Sie return, weil es wird permanenten Schreibvorgängen vorgezogen

33

OK,

Wenn ich darauf zurückkomme, kann ich das Problem sehen.

Wenn Sie in Nginx ~ eine Standort-Direktive voranstellen, bedeutet dies, dass Sie reguläre Ausdrücke in Ihrer Direktive (Groß-/Kleinschreibung, ~ * für Groß- und Kleinschreibung) behandeln möchten. Ich glaube, dass alle Regex-Direktiven vor allen anderen verarbeitet werden, aber ich muss korrigiert werden.

Also wenn ich benutze:

location ~/store {
       rewrite /trade permanent;
}

Es gibt keine Regex dort. Es ist einfach passend/speichern und zum Handel umleiten.

Nach einigen Nachforschungen (und Nacharbeiten an meinem Regex, der Müll ist), kam ich darauf zurück und habe eine funktionierende Lösung gefunden.

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

Hier fordere ich die Direktive auf, den Regex durch Eingabe von ~ zu verarbeiten und dann eine beliebige URL mit/store/darin abzugleichen.

Nach den Dokumenten lautet die Umschreibungssyntax dann:

regex-Ersetzung umschreiben [Flag]

daher ordne ich alle URLs mit Store ab und leite sie permanent in den neuen Unterordner um.

Ziemlich einfach, eigentlich peinlich, aber eigentlich ist jeder Tag ein Schultag. Ich bin offen für Korrekturen und hoffe, es hilft jemandem.

3
user1214769

Sie müssen sicherstellen, dass Ihr location ~ \.php$-Handler keine URLs unter dem alten Ordner verwendet. In der Tat sind Vorrangregeln in http://nginx.org/r/location eindeutig dokumentiert. Sie können entweder reguläre Ausdrücke verwenden oder besser den präfixbasierten Abgleich mit dem Modifikator ^~ verwenden, um das anzuweisen Die Suche muss aufhören, ohne zu prüfen, ob der reguläre Ausdruck \.php$location übereinstimmt:

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

Das obige Snippet ist wahrscheinlich der effizienteste Weg, dies zu tun, aber es gibt noch einen anderen Weg, das Gleiche zu tun:

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

Warum hat ein Beispiel $is_args$args und das andere nicht? Gute Frage! Beachten Sie, dass sowohl die location-Direktive als auch der erste Parameter der rewrite-Direktive auf der Grundlage des Inhalts der $uri-Variablen arbeiten, im Gegensatz zu $request_uri. Lange Geschichte kurz, aber $uri enthält $args nicht. In beiden Fällen enthält $1 keine args; Im Fall von rewrite gilt der Fall jedoch als so häufig, dass $args automatisch von nginx wieder hinzugefügt wird, es sei denn, die neue Zeichenfolge endet mit einem ?-Zeichen, siehe http://nginx.org/r/rewrite .

0
cnst