
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 permanent
Flag 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 rewrite
wird erst ausgeführt, wenn der erste rewrite
keine weiteren Unterstriche mehr findet. Siehedieses Dokumentfür mehr.
Antwort2
Sie können 302
den 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 @302to301
zwischen den beiden oben genannten Return-Anweisungen wählen können. Der return
Code ist im Kontext dieses Handlers jedoch irrelevant, da die error_page
obige Anweisung sicherstellt, dass alle 302
Codes in geändert werden, 301
unabhängig vom nachfolgenden Code.
Mit anderen Worten: Der einzige Unterschied zwischen den beiden return
obigen 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 300
Version ohne Text entscheiden.