Symfony2 删除生产中的“if-modified-since”参数
Posted
技术标签:
【中文标题】Symfony2 删除生产中的“if-modified-since”参数【英文标题】:Symfony2 delete the "if-modified-since" parameter on production 【发布时间】:2013-11-19 04:52:34 【问题描述】:我使用 Symfony2 为 ios 应用程序制作了一个 API。 App 发送 GET 请求,头部参数为if-modified-since
"If-Modified-Since" = "2013 年 11 月 7 日星期四 11:50:52 GMT";
在控制器中,我检查参数并在日期较新时返回数据。但在 Symfony2 中,该参数将在生产环境中的类 Symfony\Component\HttpKernel\HttpCache\HttpCache.php
中删除。这是类中的函数。
/**
* Forwards the Request to the backend and determines whether the response should be stored.
*
* This methods is triggered when the cache missed or a reload is required.
*
* @param Request $request A Request instance
* @param Boolean $catch whether to process exceptions
*
* @return Response A Response instance
*/
protected function fetch(Request $request, $catch = false)
$subRequest = clone $request;
// send no head requests because we want content
$subRequest->setMethod('GET');
// avoid that the backend sends no content
$subRequest->headers->remove('if_modified_since');
$subRequest->headers->remove('if_none_match');
$response = $this->forward($subRequest, $catch);
if ($this->isPrivateRequest($request) && !$response->headers->hasCacheControlDirective('public'))
$response->setPrivate(true);
elseif ($this->options['default_ttl'] > 0 && null === $response->getTtl() && !$response->headers->getCacheControlDirective('must-revalidate'))
$response->setTtl($this->options['default_ttl']);
if ($response->isCacheable())
$this->store($request, $response);
return $response;
所以看起来 Symfony 没有为请求的这个响应找到缓存条目,并删除了这个参数以确保会有内容要缓存,但他从来没有找到条目。在多次重新加载后也是如此。
我在控制器中需要这个参数,目前应用程序不可能更改参数或发送带有日期值的其他参数。
我是否必须进行一些配置或其他操作?
如果有人可以帮助我,我将不胜感激。
【问题讨论】:
如果您发送 If-Modified-Since 并且 Symfony 删除 if_modified_since,那么问题出在哪里。 Symfony 将这个 if_modified_since 用于其内部缓存验证目的。它永远不会删除 If-Modified-Since 标头。 确实需要配置http cache。也许您忘记在web/app.php
中输入wrap the kernel?
【参考方案1】:
似乎在您的产品环境中您使用的是app/AppCache.php
而不是app/AppKernel.php
因此,简而言之,如果您想自己处理,请在您的web/app.php
中切换回app/AppKernel.php
require_once __DIR__.'/../app/AppKernel.php';
//require_once __DIR__.'/../app/AppCache.php';
$kernel = new AppKernel('prod', false);
$kernel->loadClassCache();
//$kernel = new AppCache($kernel);
你应该详细阅读Symfony http cache
【讨论】:
以上是关于Symfony2 删除生产中的“if-modified-since”参数的主要内容,如果未能解决你的问题,请参考以下文章