More Related Content Similar to Going crazy with Varnish and Symfony (20) Going crazy with Varnish and Symfony8. Enable ESI
sub vcl_recv {
set req.http.Surrogate-Capability = "abc=ESI/1.0";
}
sub vcl_backend_response {
if (beresp.http.Surrogate-Control ~ "ESI/1.0") {
unset beresp.http.Surrogate-Control;
set beresp.do_esi = true;
}
}
10. ESI in Symfony
# app/config/config.yml
framework:
esi:
enabled: true
fragments: { path: /_fragment }
{# template.twig #}
{{ render_esi(controller('AppBundle:Red:list', {'max': 100})) }}
14. ESI in JSON
varnishd -p esi_syntax=0x00000003
{
"id": 1,
"name": "Martian Ambassador",
"_embedded": {
"category": <esi:include src="/categories/1"/>
}
}
21. Individual caching?
sub vcl_recv {
// ...
if (req.http.Authorization || req.http.Cookie) {
/* Cache all the personal things! */
return (hash);
}
// ...
}
sub vcl_deliver {
// ...
set resp.http.Vary = "Cookie,Authorization";
}
26. Configure user context
sub vcl_recv {
if (req.restarts == 0
&& (req.http.cookie || req.http.authorization)
&& (req.method == "GET" || req.method == "HEAD")
) {
if (req.http.accept) {
set req.http.X-Fos-Original-Accept = req.http.accept;
}
set req.http.accept = "application/vnd.fos.user-context-hash";
set req.http.X-Fos-Original-Url = req.url;
set req.url = "/_fos_user_context_hash";
return (hash);
}
if (req.restarts > 0
&& req.http.accept == "application/vnd.fos.user-context-hash"
) {
set req.url = req.http.X-Fos-Original-Url;
unset req.http.X-Fos-Original-Url;
if (req.http.X-Fos-Original-Accept) {
set req.http.accept = req.http.X-Fos-Original-Accept;
unset req.http.X-Fos-Original-Accept;
} else {
unset req.http.accept;
}
return (hash);
}
}
27. Configure user context
sub vcl_backend_response {
if (bereq.http.accept ~ "application/vnd.fos.user-context-hash"
&& beresp.status >= 500
) {
return (abandon);
}
}
sub vcl_deliver {
if (req.restarts == 0
&& resp.http.content-type ~ "application/vnd.fos.user-context-hash"
) {
set req.http.X-User-Context-Hash = resp.http.X-User-Context-Hash;
return (restart);
}
set resp.http.Vary = regsub(resp.http.Vary, "(?i),? *X-User-Context-Hash *", "");
set resp.http.Vary = regsub(resp.http.Vary, "^, *", "");
if (resp.http.Vary == "") {
unset resp.http.Vary;
}
unset resp.http.X-User-Context-Hash;
}
28. Cleaning cookies
$ varnishlog -c -i ReqHeader -I Cookie
Cookie: __uvt=;PHPSESSID=ht8rl2tnbikpeoau7q5g677125;_ga=GA1.2.1332615739.14
31368832;uvts=320PnWhzN5bW7V2D
sub vcl_recv {
set req.http.cookie = ";" + req.http.cookie;
set req.http.cookie = regsuball(req.http.cookie, "; +", ";");
set req.http.cookie = regsuball(req.http.cookie, ";(PHPSESSID)=", "; 1=");
set req.http.cookie = regsuball(req.http.cookie, ";[^ ][^;]*", "");
set req.http.cookie = regsuball(req.http.cookie, "^[; ]+|[; ]+$", "");
}
Cookie: PHPSESSID=ht8rl2tnbikpeoau7q5g677125
30. Custom provider
<?php
use FOSHttpCacheUserContextContextProviderInterface;
use FOSHttpCacheUserContextUserContext;
class IsAwesomeProvider implements ContextProviderInterface
{
private $userService;
public function __construct(YourUserService $userService)
{
$this->userService = $userService;
}
public function updateUserContext(UserContext $userContext)
{
$userContext->addParameter('awesome', $this->userService->isAwesome());
}
}
//
<service id="app_bundle.provider" class="AppBundleProviderIsAwesomeProvider">
<tag name="fos_http_cache.user_context_provider" />
</service>