Situácia
Na clientovi mám jQUery, ktoré každú minútu kontroluje, či sa nezmenili dáta. Tie vracia Drupal v podobe jsonu modulom views_datasource.
Problém
Keď pre ajax request vypnem cache, tak ku každému volaniu pridá timestamp, napr. _=1456134256000, a keďže je to get parameter, views v Drupale sa pregenerujú a nevrátia nacacheované dáta. Keď je ajax cache zapnutá, tak sa url nemení a tým pádom browser vráti jeho dáta bez toho, aby zavolal server. čo potrebujem je obísť cache browseru, ale na strane serveru dostať dáta z cache.
Riešenie s nginx
Podarilo sa mi docieliť to, že nginx odstráni argument _ z requestu a zavolá Drupal bez neho. Týmto spôsobom obídem cache browseru, ale zároveň dostanem nacacheované dáta z Drupalu. V kombinácii s týmto používam views_content_cache, takže sa cache premaže len pri vytvorení nového obsahu.
V konfigurácii nginxu som spavil 2 úpravy.
- odstrániť _ argument z $args
location ~ ^/path/ {
if ($args ~ (.*)&_=\d+(.*)) {
set $args $1$2;
}
rewrite ^/([^/]*)/(.*)(/?)$ /$1/index.php?q=$2;
}
- odstrániť _ argument z cesty, s ktorou sa volá fastcgi
# save $request_uri
set $request_url $request_uri;
# modify request uri, remove '_' arg
if ($request_uri ~ ^/path/(.*)&_=\d+(.*)) {
set $request_url /path/$1$2;
}
location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
include fastcgi_params;
# rewrite request uri by request url
fastcgi_param REQUEST_URI $request_url;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass 127.0.0.1:9000;
fastcgi_read_timeout 1800;
}
Pozn.: Lepšie riešenie na aktulizáciu dát na strane klienta by bolo použitie nodejs a socket.io.