3

我发现一篇文章概述了如何从 Symfony 1.4 的缓存中排除参数,我想为 Symfony 2.3 做一些类似的事情。

当使用说 Adwords 时,URI 中将包含一堆与页面呈现无关的查询参数[gclid, x, y, utm_source, utm_medium, utm_campaign, utm_content],我想要一种方法告诉 Symfony2 缓存以下页面是相同的并将它们缓存为一个页面:

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

有人知道怎么做吗?

4

2 回答 2

2

假设您使用的是 Symfony2 AppCache 而不是 Varnish。AppCache 是一个 php 反向代理:它缓存 URI 响应和进程标头。显然,以下 uris :

是不同的,所以诀窍是使它们等于反向代理。你可以在很多层面上做到这一点:

  • 在网络服务器上
  • Request物体上
  • 在 AppCache 存储上

IMO 更简单的解决方案是在创建时将它们删除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);
于 2013-09-06T10:06:07.127 回答
0

基于 LFI 的回答,我稍微简化了整个构造(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));
}
于 2017-01-21T15:01:45.807 回答