【问题标题】:How do I invalidate cache for a controller url?如何使控制器 url 的缓存无效?
【发布时间】:2014-03-10 09:03:14
【问题描述】:

我想使 symfony2 中的 HTTP 缓存失效。我使用以下方法:

protected function invalidateCache($url)
{
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PURGE');
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_HEADER, true);

    curl_exec($ch);
    $status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);

    return $status == 200;
}

这行得通,没问题。但是,当我使用 ESI 时,我会使用 controller() 函数(不是 path()),例如:

{{ render_esi(controller('AcmeDemoBundle:Default:index')) }}

如何获取控制器函数生成的url?或者如何使该 esi 请求的缓存响应无效?

【问题讨论】:

    标签: symfony caching http-caching esi


    【解决方案1】:

    这就是你的做法:你没有。

    我想使用 controller() 函数而不是 path() 的原因是因为 Symfony 将保护 URL 免受 controller() 的未经授权的请求。您应该做的是使用 path() 并在 URL 前加上“esi/”,然后在 security.yml 中保护该 URL。

    //app/config/security.yml
    security: 
      # // ---
      access_control:
        - { path: ^/esi/.*, roles: IS_AUTHENTICATED_ANONYMOUSLY, ip: 127.0.0.1 }
    

    如果你想清除缓存,你只需像往常一样使用 url。

    感谢 Twitter 上的 @jongotlin 帮助我解决这个问题。

    【讨论】:

    • 您能否详细说明一下。我正在尝试使我的反向代理缓存无效,但到目前为止没有任何效果。我希望每当后端管理员访问后端时触发首页失效。
    • 不,抱歉,这里不是描述缓存失效基础的地方。确保您阅读并理解此文档symfony.com/doc/current/book/http_cache.html 您还应该考虑使用 FOSHttpCacheBundle。因为他们让事情变得非常容易。阅读并理解他们的文档:foshttpcachebundle.readthedocs.org/en/latest
    • 没关系,谢谢。写完这篇文章后不久,我明白了我的问题。控制器无法访问需要身份验证的路由,当我将您提到的内容放在未经身份验证的路由中时它起作用(无论如何我认为这是您的答案)
    • 我对反向代理的理解是PURGE方法只删除那个url的缓存。那么 esi/url 方法是如何工作的呢?您愿意为此分享您的控制器代码的 sn-p 吗?谢谢。
    • 您将 ESI 请求视为与任何其他 URL 相同。 (您不会使用 controller() 函数。)但是,正如我所说,请注意您必须使用防火墙规则保护您的 ESI 端点。
    猜你喜欢
    • 2013-04-18
    • 2011-10-04
    • 2020-09-22
    • 2015-02-05
    • 1970-01-01
    • 2020-09-10
    • 2015-02-07
    • 1970-01-01
    • 2023-03-21
    相关资源
    最近更新 更多