Return Lookup
Jaap van Arragon
j.vanarragon at lukkien.com
Wed Nov 23 13:38:28 CET 2011
Hello Hugo,
Thank you for your answer.
It was most helpful!!
Regards,
Jaap
On 11/23/11 12:49 PM, "Hugo Cisneiros (Eitch)" <hugo.cisneiros at gmail.com>
wrote:
> On Wed, Nov 23, 2011 at 9:32 AM, Jaap van Arragon
> <j.vanarragon at lukkien.com> wrote:
>> Hello,
>>
>> Hopefully a short question:
>>
>> We have the following code in our VCL file:
>>
>> sub vcl_recv {
>>
>> # Purge through http
>> if (req.request == "PURGE") {
>> if (!client.ip ~ purge) {
>> error 405 "Not allowed.";
>> }
>> ban("req.url =" + req.url + "&& req.http.host =" + req.http.host);
>> error 200 "Purged.";
>> }
>>
>> if (req.http.cookie) {
>> unset req.http.cookie;
>> return (lookup);
>> }
>>
>> if (req.http.host ~ "example.url.com") {
>> set req.backend = live;
>> }
>> else {
>> error 404 "Unkown Virtual host";
>> }
>>
>> When our request ( example.url.com/asdja?adn23 ) comes in we see that the
>> backend is selected which it first came across. We¹ve could pinpoint it to
>> the unset.req.http.cookie part. If we move the unset cookie part under the
>> req.http.host ~ "example.url.com" part it all goes fine.
>>
>> Can it be that the return(lookup); in the unset req.http.cookie part skips
>> the req.http.host part? And thus the first backend is selected?
>
> Yes. The 'return(lookup)' after the 'unset req.http.cookie' will skip
> all the rest of vcl_fetch. It will lookup in the cache and go to the
> vcl_hit or vcl_pass depending if the object is found or not.
>
> You must place return(lookup) only after all required rules are done.
> For example, I think this would work:
>
> if (req.http.cookie) {
> if (req.http.host ~ "example.url.com") {
> set req.backend = live;
> }
> else {
> error 404 "Unkown Virtual host";
> }
>
> unset req.http.cookie;
> return (lookup);
> }
>
> Hope it will help.
More information about the varnish-misc
mailing list