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?
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? –
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. –
Ja, ich glaube, das ist, was ich gesucht habe. Vielen Dank! –