首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Symfony2 HTTP缓存:在生成缓存时是否存在忽略查询参数的方法?

Symfony2 HTTP缓存:在生成缓存时是否存在忽略查询参数的方法?
EN

Stack Overflow用户
提问于 2013-08-27 17:15:31
回答 2查看 1.4K关注 0票数 3

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

在使用say Adword时,uri中将包含一组查询参数,这些参数与页面[gclid, x, y, utm_source, utm_medium, utm_campaign, utm_content]的呈现无关,我希望有一种方法告诉Symfony2缓存,以下页面是相同的,并将它们缓存为一个页面:

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

有人知道怎么做吗?

EN

回答 2

Stack Overflow用户

发布于 2013-09-06 10:06:07

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

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

它们是不同的,所以诀窍将是使它们在反向代理中相等。你可以在很多层面上这样做:

  • 在web服务器上
  • 关于Request对象
  • 关于AppCache存储

更简单的解决方案是在创建时将它们从Request中删除。下面的代码在app.php中直接完成了这个任务,如果您想要的话,您可以对请求对象的子类执行同样的操作,但是您必须处理引导。

代码语言:javascript
复制
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);
票数 2
EN

Stack Overflow用户

发布于 2017-01-21 15:01:45

基于LFI的回答,我简化了整个构造(AppBundle::CACHE_SKIP_PARAMS包含跳过的参数数组):

代码语言:javascript
复制
// 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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18471713

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档