2013-08-27 3 views
3

exclude parameters from the cache for Symfony 1.4에 대한 간략한 게시물을 발견했으며 Symfony 2.3과 비슷한 것을하고 싶습니다.Symfony2 HTTP 캐시 : 캐시를 생성 할 때 쿼리 매개 변수를 무시할 수있는 방법이 있습니까?

애드 워즈를 사용할 때 url에 포함 된 쿼리 매개 변수는 [gclid, x, y, utm_source, utm_medium, utm_campaign, utm_content] 페이지의 렌더링과 관련이 없으며 Symfony2 캐시에 다음 페이지가 동일하다는 것을 알려주고 싶습니다. 한 페이지로 캐시 :

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

누구든지이 작업을 수행하는 방법을 알아?

+0

나는 사용자가 이러한 검색어 매개 변수를 보자 않을 것이다 : LFIs의 답변에 따라

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

+0

Google 애널리틱스 스크립트에서 이러한 변수를 수집해야합니까? 그건 자바 스크립트 리디렉션이 필요 없다는 뜻인가요? – jcroll

+0

이 특정 쿼리 매개 변수를 사용하여 서버 측에서 작업하고 있습니까? – LFI

답변

2

광택을 사용하지 않고 Symfony2 AppCache를 사용한다고 가정합니다. AppCache는 PHP 리버스 프록시입니다. URI 응답과 프로세스 헤더를 캐시합니다. 분명히 , 다음 URI는 :

는 다른, 그래서 트릭은 그들이 역방향 프록시에 대해 동일하게하는 것입니다. 당신은 많은 수준에 그 작업을 수행 할 수 있습니다

  • 를 웹 서버에
  • Request 객체입니다 AppCache를 저장

IMO 쉽게 솔루션에서 Request에서 그들을 제거하는 것입니다에

  • 에 창조. 다음 코드는 app.php에서 직접 트릭을 수행합니다. 원하는 경우 Request 객체의 하위 클래스와 동일하게 수행 할 수 있지만 부스트랩을 처리해야합니다.

    // 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)); 
    } 
    
  • +0

    ['parse_str ($ string, array $ output)'] (http://www.php.net/manual/en/function.parse-str.php)을 사용하는 것이 더 쉬웠을 것입니다. –

    0

    , 나는 전체 구조 조금 (AppBundle :: CACHE_SKIP_PARAMS가 생략 된 매개 변수의 배열을 포함)을 단순화. 대신 필터를 사용하고 일반 URL로 리디렉션하십시오.