2014-11-04 3 views
0

Я пытаюсь установить cookie с использованием Varnish, но не вижу, как обрабатываются несколько заголовков с одинаковым именем. Например, если несколько куков должны быть установлены, приложение будет отправить:Использование Varnish 3 для установки файлов cookie

Set-Cookie:sources=source+2; expires=Tue, 04-Nov-2014 17:12:50 GMT; path=/; domain=.xampp.com.local 
Set-Cookie:someOtherCookie=othervalue; expires=Tue, 04-Nov-2014 17:12:50 GMT; path=/; domain=.xampp.com.local 

В Varnish я только когда-либо хочу установить одно печенье, но если задний конец ответ включал в себя заголовок Set-Cookie или если у клиента уже есть куки-файлы, я хочу быть уверенным, что я не уничтожаю их при настройке своего файла cookie.

Расширение Скипидар из Nexcess, кажется, работает немного магии внутри C со следующим, который отвечает за создание сеанса:

sub generate_session { 
    # generate a UUID and add `frontend=$UUID` to the Cookie header, or use SID 
    # from SID URL param 
    if (req.url ~ ".*[&?]SID=([^&]+).*") { 
     set req.http.X-Varnish-Faked-Session = regsub(
      req.url, ".*[&?]SID=([^&]+).*", "frontend=\1"); 
    } else { 
     C{ 
      char uuid_buf [50]; 
      generate_uuid(uuid_buf); 
      VRT_SetHdr(sp, HDR_REQ, 
       "\030X-Varnish-Faked-Session:", 
       uuid_buf, 
       vrt_magic_string_end 
      ); 
     }C 
    } 
    if (req.http.Cookie) { 
     # client sent us cookies, just not a frontend cookie. try not to blow 
     # away the extra cookies 
     std.collect(req.http.Cookie); 
     set req.http.Cookie = req.http.X-Varnish-Faked-Session + 
      "; " + req.http.Cookie; 
    } else { 
     set req.http.Cookie = req.http.X-Varnish-Faked-Session; 
    } 
} 

sub generate_session_expires { 
    # sets X-Varnish-Cookie-Expires to now + esi_private_ttl in format: 
    # Tue, 19-Feb-2013 00:14:27 GMT 
    # this isn't threadsafe but it shouldn't matter in this case 
    C{ 
     time_t now = time(NULL); 
     struct tm now_tm = *gmtime(&now); 
     now_tm.tm_sec += 3600; 
     mktime(&now_tm); 
     char date_buf [50]; 
     strftime(date_buf, sizeof(date_buf)-1, "%a, %d-%b-%Y %H:%M:%S %Z", &now_tm); 
     VRT_SetHdr(sp, HDR_RESP, 
      "\031X-Varnish-Cookie-Expires:", 
      date_buf, 
      vrt_magic_string_end 
     ); 
    }C 
} 

И они проверяют, чтобы увидеть, если пользователь уже имеет внешний интерфейс печенье со следующим:

if (req.http.Cookie !~ "frontend=") { 
    # it's a real user, make up a new session for them 
    call generate_session; 
} 

Итак, как же я имею дело со случаями, когда один или несколько из следующих действий происходят:

  • Лак добавляет внешний интерфейс = печенье для Magento (скипидара)
  • Бэкэнд возвращается один или несколько печенье
  • клиент уже имеет один или несколько печенье

ответ