Buenas,
Tengo una duda en cuanto al funcionamiento de Symfony en el manejo de las peticiones a bloques ESI. Resulta que tengo una aplicación hace uso de dichos bloques y que tiene definido un event listener sobre el evento kernel.request
de Symfony.
La cuestión es que cuando accedo a la aplicación a través de un proxy inverso (Varnish en mi caso) el event listener únicamente se ejecuta para la URL principal, mientras que si accedo directamente a través del servidor web el event listener se ejecuta una vez por cada bloque ESI (en este caso sería por cada subrequest). Comentar también que las peticiones a los bloques ESI las realizo mediante petición al controlador, no a URL.
No sé si alguien me podría aclarar un poco este tema, ya que en la documentación de Symfony no he encontrado nada que aclare mis dudas.
Un saludo
Respuestas
Aunque no uso Varnish, me atrevo a añadir algunos comentarios. El primero seguramente ya lo has tenido en cuenta, pero se trata de añadir lo siguiente en la configuración de Varnish para que tenga en cuenta los bloques ESI:
sub vcl_recv { // Add a header to announce ESI support. set req.http.Surrogate-Capability = "abc=ESI/1.0"; }
La otra referencia que te quería pasar es este artículo que explica con detalle algunas configuraciones adicionales que hay que hacer cuando se usan cookies, Varnish y ESI.
@javiereguiluz
Muchas gracias por tu respuesta Javier, efectivamente he tenido en cuenta lo comentas, mi duda se refiere más bien a la forma que tiene symfony de tratar las peticiones realizadas a bloques ESI, ya que, mientras depuraba para tratar de dar con la causa de unos errores registrados en el log de nginx me he dado cuenta del comportamiento que describo en mi comentario.
Esto me lleva a pensar que igual Symfony trata las peticiones ESI de alguna manera especial, evitando que se generen algunos eventos del ciclo del vida de la petición o algo así, aunque esto es sólo una hipótesis mía, igual estoy diciendo una tontería. En cualquier caso, muchas gracias por la ayuda.
@beni0888
Buenas, no se si cuando se habla de esi (que no lo he usado), el asunto de los sub request es diferente, pero lo que yo hago para que un listener no se me ejecute varias veces (cuando hago {{ render(controller(...)) }}
) es verificar si la petición es maestra o no:
public function onKernelResponse(FilterResponseEvent $event) { if (!$event->isMasterRequest()) { return; } //... ejecuto los procesos del listener }
Acá te paso un ejemplo donde lo aplico:
https://github.com/manuelj555/AjaxBundle/blob/master/EventListener/AjaxHandlerListener.php#L62
Saludos!
@manuel_j555
@manuel_j555 eso que comentas es lo mismo que aplico yo en el código renderizado vía bloque ESI. La cuestión es que parece que cuando la petición al código en cuestión es realizada por un proxy inverso vía ESI, Symfony no identifica la petición como una subrequest, de ahí mis dudas y mi pregunta. De todos modos muchas gracias por tu respuesta :)
@beni0888
Bueno, buscando encontré a alguien que mencionó el listener de Symfony FragmentListener en el cual verifican la existencia del prefijo /_fragment
en la url para saber si la petición es ESI o no.
Quizas eso pueda servirte de algo. Saludos!!!
@manuel_j555