Drupal Nginx Json
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
        location ~ ^/path/ {
                if ($args ~ (.*)&_=\d+(.*)) {
                        set $args $1$2;
                }
                rewrite ^/([^/]*)/(.*)(/?)$ /$1/index.php?q=$2;
        }
  1. 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.