假设您使用的是 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);