2017-07-10 3 views
0

Je voudrais configurer les règles Varnish 2.1.5 pour afficher le contenu d'une autre page dans certains cas, tout en conservant l'URL d'origine intacte.Afficher le contenu de/page/a sur url/page/b Varnish

par exemple lorsque l'utilisateur demande /page/a s/il sera affiché à la place /page/b, mais voir encore l'URL /page/a dans le navigateur.

Ce cas d'utilisation spécifique est nécessaire pour gérer avec élégance les erreurs 404 sur les pages traduites. Je ne suis pas sûr de savoir comment envoyer la demande à travers à vcl_recv

Le que je comprends, le flux du cycle de vie, et la logique actuelle ressemble à ceci:

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); 
    } 

Qu'est-ce que je suppose, au lieu de set obj.http.Location "https://site/page/a";, je besoin d'envoyer en quelque sorte la demande à vcl_recv puis utilisez regsub().

Comment pourrais-je m'y prendre?

Répondre

1

devrait être aussi facile que:

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

Oui, c'est-ce que je suis en train de lire aussi bien. Cependant, c'est un peu plus compliqué. Pourriez-vous jeter un coup d'oeil à ma question révisée? Comment puis-je renvoyer la demande à travers le cycle de vie de 'vcl_error' à' vcl_recv'? Ou puis-je simplement définir 'req.url' dans' vcl_error' et l'appeler un jour? –

+0

Vous devrez ensuite '' 'retourner (redémarrer)' '' après avoir "réécrit" l'URL via Varnish. Cela lui permettra de passer à travers '' '' vcl_recv''', etc. Voir la mise à jour –

+0

Oui, je crois que c'est ce que je cherchais. Merci! –