2013-08-27 1 views
3

Я нашел сообщение о том, как exclude parameters from the cache for Symfony 1.4, и я хотел бы сделать что-то похожее для Symfony 2.3.Symfony2 HTTP cache: существует ли способ игнорировать параметры запроса при генерации кеша?

При использовании утверждений Adwords в uri будет включена куча параметров запроса, которые не имеют никакого отношения к рендерингу страницы [gclid, x, y, utm_source, utm_medium, utm_campaign, utm_content], и я хотел бы указать кешу Symfony2, что следующие страницы одинаковы и кэшировать их на одной странице:

  • http://www.example.com
  • http://www.example.com?gclid=1

Кто знает, как это сделать?

+0

Я бы не позволить пользователям видеть эти параметры запроса. Вместо этого используйте фильтр и перенаправляйте на простой URL-адрес. – Marek

+0

Не будут ли эти переменные собираться с помощью сценариев Google Analytics? Это означало бы, что перенаправление javascript не потребуется? – jcroll

+0

Вы делаете что-то на стороне сервера с помощью этих определенных параметров запроса? – LFI

ответ

2

Предполагая, что вы используете Symfony2 AppCache, а не Varnish. AppCache - это обратный прокси php: он кэширует ответ URI и заголовки процессов. Очевидно, что следующие URIs:

различны, поэтому трюк будет сделать их равными для обратного прокси-сервера. Вы можете сделать это на многих уровнях:

  • на веб-сервере
  • на Request объекта
  • на AppCache хранения

ИМО простое решение, чтобы удалить их из Request в создание. Следующий код делает трюк непосредственно в app.php, если вы хотите, чтобы вы могли сделать то же самое с подклассом объекта Request, но вам придется иметь дело с boostrap.

require_once __DIR__.'/../app/AppKernel.php'; 
require_once __DIR__.'/../app/AppCache.php'; 

$kernel = new AppKernel('prod', false); 
$kernel->loadClassCache(); 
$kernel = new AppCache($kernel); 
Request::enableHttpMethodParameterOverride(); 
$request = Request::createFromGlobals(); 
//Modify query string here 
$qs = $request->server->get('QUERY_STRING'); 
if ('' != $qs) { 

    $parts = array(); 

    foreach (explode('&', $qs) as $chunk) { 

     $param = explode("=", $chunk); 

     if (!$param || !in_array($param[0], array('gclid', 'x', 'y', 'utm_source', 'utm_medium', 'utm_campaign', 'utm_content'))) { 
      $parts[] = $chunk; 
     } 
    } 
    $request->server->set('QUERY_STRING', implode('&', $parts)); 
} 
$response = $kernel->handle($request); 
$response->send(); 
$kernel->terminate($request, $response); 
+0

Было бы проще использовать ['parse_str ($ string, array $ output)'] (http://www.php.net/manual/en/function.parse-str.php) –

0

основе LFIS ответа, я упростил всю конструкцию немного (AppBundle :: CACHE_SKIP_PARAMS содержит массив пропущенных параметров):

// Exclude irrelevant parameters 
$qs = $request->server->get('QUERY_STRING'); 

if ('' != $qs) 
{ 

    parse_str($qs, $params); 

    if (is_array($params) && !empty($params)) 
    { 
     $relevantParams = []; 

     foreach ($params as $key => $value) 
     { 
      if (!in_array($key, \AppBundle\AppBundle::CACHE_SKIP_PARAMS)) 
      { 
       $relevantParams[$key] = $value; 
      } 
     } 

     $params = $relevantParams; 
    } 

    $request->server->set('QUERY_STRING', implode('&', $params)); 
} 
Смежные вопросы