2017-07-10 3 views
0

Ich möchte Varnish 2.1.5-Regeln einrichten, um in einigen Fällen Inhalte von einer anderen Seite anzuzeigen, die ursprüngliche URL jedoch intakt zu lassen.Inhalt anzeigen von/page/a auf url/page/b Varnish

zB Wenn der Benutzer /page/a anfordert wird er/sie stattdessen /page/b angezeigt, aber sehen Sie immer noch die /page/a URL im Browser.

Dieser spezielle Anwendungsfall brauche ich, um fehlerfrei 404-Fehler auf übersetzten Seiten zu behandeln. Ich bin nicht sicher, wie die Anfrage durch vcl_recv

Die zurück zu senden, wie ich es verstehe, die Lifecycle-Flow und aktuelle Logik sieht wie folgt aus:

sub vcl_recv { 
    if(req.http.cookie ~ "lang_pref") { 
    # Redirect to Preferred Language 
    error 999 "i18n cookie"; 
    }... 

sub vcl_deliver { 
    if (resp.status == 999) { 
    set resp.status = 302; 
    set resp.response = "Found"; 
    }... # more i18n logic 

sub vcl_fetch { 
    # Set Varnish error if backend cant find requested i18n page 
    if (beresp.status == 404 && req.url ~ "^\/(en|fr|de)(\/.*)?$") { 
    error 494; 
    }... 

sub vcl_error { 
    # Double check i18n pages for English before 404 
    if (obj.status == 494) { 
    set obj.http.Location = "https://site/page/a"; 
    } 
    set obj.status = 302; 

    return(deliver); 
    } 

Was ich gehe davon aus, statt set obj.http.Location "https://site/page/a";, ich Irgendwie müssen Sie die Anfrage zurück an vcl_recv senden dann verwenden Sie regsub().

Wie würde ich darüber gehen?

Antwort

1

sollte so einfach sein wie:

sub vcl_error { 
    # Double check i18n pages for English before 404 
    if (obj.status == 494 && req.url == "/page/a") { 
     set req.url = "/page/b"; 
     return(restart); 
    } 
} 
+0

Ja, das ist das, was ich auch lese. Es ist jedoch ein bisschen komplizierter. Könnten Sie sich meine überarbeitete Frage ansehen? Wie kann ich die Anfrage über den Lebenszyklus von 'vcl_error' zurück nach' vcl_recv' schicken? Oder kann ich 'req.url' einfach innerhalb' vcl_error' setzen und es einen Tag nennen? –

+0

Sie müssen dann '' '(neu starten)' '' nach "Neuschreiben" der URL über Varnish. Dies wird es ermöglichen, '' '' 'vcl_recv''' usw. erneut zu durchlaufen. Siehe aktualisierte Antwort. –

+0

Ja, ich glaube, das ist, was ich gesucht habe. Vielen Dank! –