基本
非常に単純なテスト アクションを作成しました。
/**
* @Route("/public/debug/varnish", name="debug_varnish")
* @Template
*/
public function varnishAction()
{
return [];
}
{# varnish.html.twig #}
<html>
<body>
<h1>Layout</h1>
<hr />
{{ render_esi(controller('TestBundle:Debug:esi')) }}
</body>
</html>
付属のアクションと小枝は今は重要ではありません。
テスト
Varnish はSurrogate-Control: content="ESI/1.0"
、応答にヘッダーを必要とします。何が起こるか見てください:
curl -H 'host:www.domain.com' -H 'Surrogate-Capability: abc=ESI/1.0' http://127.0.0.1:8080/public/debug/varnish
応答:
<html>
<body>
<h1>Layout</h1>
<hr />
<esi:include src="/_proxy?_path=_format%3Dhtml%26_locale%3Den_US%26_controller%3DTestBundle%253ADebug%253Aesi" onerror="continue" />
</body>
</html>
すべて大丈夫です!しかし、ヘッダーを見てください:
curl -I -H 'host:www.domain.com' -H 'Surrogate-Capability: abc=ESI/1.0' http://127.0.0.1:8080/public/debug/varnish
出力:
HTTP/1.1 200 OK
Server: nginx/1.2.1
Content-Type: text/html; charset=UTF-8
Connection: keep-alive
X-Powered-By: PHP/5.5.9-1~dotdeb.1
Set-Cookie: PHPSESSID=k8jii3gkrha1js7edbbbqjjh32; path=/
Cache-Control: no-cache
Date: Tue, 18 Feb 2014 11:21:04 GMT
Surrogate-Control
ヘッダーがない!
\Symfony\Component\HttpKernel\HttpCache\Esi クラス
コンテンツに文字列Surrogate-Control
が含まれている場合、ヘッダーを追加する非常に単純な関数があります。<esi:include
/**
* Adds HTTP headers to specify that the Response needs to be parsed for ESI.
*
* This method only adds an ESI HTTP header if the Response has some ESI tags.
*
* @param Response $response A Response instance
*/
public function addSurrogateControl(Response $response)
{
if (false !== strpos($response->getContent(), '<esi:include')) {
$response->headers->set('Surrogate-Control', 'content="ESI/1.0"');
}
}
しかし、そうではありません!if は「真」です。これで呼び出すと:
public function addSurrogateControl(Response $response)
{
var_dump(false !== strpos($response->getContent(), '<esi:include'));
if (false !== strpos($response->getContent(), '<esi:include')) {
echo "before add header\n";
$response->headers->set('Surrogate-Control', 'content="ESI/1.0"');
echo "after add header\n";
}
echo "after if"
}
curl -H 'host:www.domain.com' -H 'Surrogate-Capability: abc=ESI/1.0' http://127.0.0.1:8080/public/debug/varnish
応答:
(bool) true
before add header
after add header
after if
<html>
<body>
<h1>Layout</h1>
<hr />
<esi:include src="/_proxy?_path=_format%3Dhtml%26_locale%3Den_US%26_controller%3DTestBundle%253ADebug%253Aesi" onerror="continue" />
</body>
</html>
curl -I -H 'host:www.domain.com' -H 'Surrogate-Capability: abc=ESI/1.0' http://127.0.0.1:8080/public/debug/varnish
出力:
HTTP/1.1 200 OK
Server: nginx/1.2.1
Content-Type: text/html; charset=UTF-8
Connection: keep-alive
X-Powered-By: PHP/5.5.9-1~dotdeb.1
Set-Cookie: PHPSESSID=k8jii3gkrha1js7edbbbqjjh32; path=/
Cache-Control: no-cache
Date: Tue, 18 Feb 2014 11:21:04 GMT
ヘッダーはどこSurrogate-Control
にありますか? :-o
その他のテスト:
public function addSurrogateControl(Response $response)
{
// [1]
if (false !== strpos($response->getContent(), '<esi:include')) {
// [2]
}
// [3]
}
と$response->headers->set('Surrogate-Control', 'content="ESI/1.0"');
(!!!) header('Test: test OK')
:
- 【1】場所:WORK!
- [2] 元の場所: 動作しません:(
- 【3】場所:WORK!
Ok。したがって、ヘッダーの変更が にあるIF
場合、機能しません。なんで?
魔法
条件を変更する$response->getContent()
と'test <esi:include test'
、if
すべてが正常に機能します。Response
クラスgetContent()
関数:
public function getContent()
{
return $this->content;
}
理解できない :-/