[英]Symfony2 HTTP cache: is there a way to ignore query parameters when generating the cache?
我发现了一篇文章,概述了如何从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
有人知道怎么做吗?
假设您使用的是Symfony2 AppCache而不是Varnish。 AppCache是一个php反向代理:它缓存URI响应和进程头。 显然,以下uris:
是不同的,所以诀窍是使它们等于反向代理。 你可以在很多层面上做到这一点:
Request
对象上 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);
基于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));
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.