
Po, 22.2.2016 - 10:57
### 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.
1. odstrániť _ argument z $args
```nginx
location ~ ^/path/ {
if ($args ~ (.*)&_=\d+(.*)) {
set $args $1$2;
}
rewrite ^/([^/]*)/(.*)(/?)$ /$1/index.php?q=$2;
}
```
2. odstrániť _ argument z cesty, s ktorou sa volá fastcgi
```nginx
# 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.