Beenden Sie die Verarbeitung der Umschreibeanweisungen am Standort und geben Sie 301 zurück.

Beenden Sie die Verarbeitung der Umschreibeanweisungen am Standort und geben Sie 301 zurück.

Ich habe Folgendes in meiner nginx.conf:

location ~* /collections.*?products/([^/]+)/?$ {
    rewrite ^/collections.*?products/([^/]+)/?$ /$1.html;
    rewrite ^([^_]*)_([^_]*)_(.*)$ $1-$2-$3;
    rewrite ^([^_]*)_(.*)$ $1-$2 permanent; 
}  

Um Anfragen umzuschreiben wie

"/collections/products/someproduct/" to "/someproduct.html"
"/collections/products/some_product/" to "/some-product.html"
"/collections/products/some_other_product/" to "/some-other-product.html"

Ich kann jedoch nur dann eine 301-Umleitung erhalten, wenn die letzte Umschreibeanweisung (die das permanentFlag enthält) übereinstimmt und verarbeitet wird, z. B. mein 2. Beispiel. In den anderen beiden Fällen erhalte ich eine temporäre 302-Umleitung. Wie kann ich diese mehreren Umschreibeanweisung in diesem Standortblock verarbeiten und eine 301-Umleitung zurückgeben, unabhängig davon, welche übereinstimmen? Wenn ich allen Umschreibeanweisung ein permanentes Flag verleihe, wird die Verarbeitung nach der ersten Übereinstimmung gestoppt.

Antwort1

Sie können rekursiv und unabhängig von _konvertieren .-rewrite...permanent

Zum Beispiel:

location ~* /collections.*?products/([^/]+)/?$ {
    rewrite ^(.*)_(.*)$ $1-$2 last;
    rewrite ^/collections.*?products/([^/]+)/?$ /$1.html permanent; 
}

Der zweite rewritewird erst ausgeführt, wenn der erste rewritekeine weiteren Unterstriche mehr findet. Siehedieses Dokumentfür mehr.

Antwort2

Sie können 302den Statuscode als „Ausnahme“ behandeln und ihn mithttp://nginx.org/r/error_page.

location ~* /collections.*?products/([^/]+)/?$ {
    rewrite ^/collections.*?products/([^/]+)/?$ /$1.html;
    rewrite ^([^_]*)_([^_]*)_(.*)$ $1-$2-$3;
    rewrite ^([^_]*)_(.*)$ $1-$2 permanent;
    error_page 302 =301 @302to301;
}
location @302to301 {
    return 300; # 300 is just a filler here, error_page dictates status code
    #return 301 $sent_http_location;
}

Die Technik ist ähnlich wie bei meiner301-302-redirect-w-no-http-body-text.nginx.conf, gemäßeine verwandte Frage zur Erstellung von 301/302-Weiterleitungen ohne HTTP-Antworttext.

Beachten Sie, dass Sie innerhalb @302to301zwischen den beiden oben genannten Return-Anweisungen wählen können. Der returnCode ist im Kontext dieses Handlers jedoch irrelevant, da die error_pageobige Anweisung sicherstellt, dass alle 302Codes in geändert werden, 301unabhängig vom nachfolgenden Code.

Mit anderen Worten: Der einzige Unterschied zwischen den beiden returnobigen Anweisungen besteht im Inhalt des HTTP-Antworttexts, den ohnehin kein Browser bei 301-Antworten anzeigt. Sie können sich also auch gleich für die kürzere return 300Version ohne Text entscheiden.

verwandte Informationen