ssi, блочное кеширование и авторизация...

Yury nginx-forum at nginx.us
Tue Oct 27 17:33:18 MSK 2009


(Apache+php) ==> nginx
Вопрос вот какой: есть страничка, должна выдаваться _только_ авторизованным пользователям, на ней имеются блоки:
1) информация о пользователе (ключ кеша proxy_cache_key "$scheme|$proxy_host|$uri|$is_args|$args|$cookie_sid")
2) общий блок (ключ без куки proxy_cache_key "$scheme|$proxy_host|$uri|$is_args|$args";)

Вопрос собственно вот в чем:
можно-ли, при приходе запроса от пользователя, проверять валидность куки (через апач+пхп) и в ключ добавить поле "авторизован пользователь?". Это позволило бы выдавать блок (2) всем авторизованнм пользователям один и тот же и при этом не выдавать его тем кто не авторизован. То же касается и блока (1), защита от подсовывания куки ручками, даже если ее сбросили при logout-е, но у пользователь сохранил ее отдельно и теперь пытается подсунуть.

Сейчас получается что для выдачи _любой_ страницы из кеша достаточно правильно составить запрос чтобы подошел составной ключ кеша и страничка отдастся. Даже если кука предъявляемая пользователем давно протухла, но соответствующий ключ кеша еще жив.

Конфиг сейчас приблизительно такой:

proxy_cache_path /var/lib/nginx/proxy_my levels= keys_zone=my_cache:64m max_size=1024m inactive=1d;

server {
        listen          192.168.0.1:80;
        server_name     *.test;

        proxy_set_header        Host            $host;
        proxy_set_header        X-Forwarded-For $remote_addr;

        access_log  /var/log/nginx/logs.test/access_log main;
        error_log   /var/log/nginx/logs.test/error_log debug;

        ssi on;
        ssi_silent_errors off;

        location / {
          proxy_intercept_errors  on;
          proxy_pass              http://192.168.0.1:81/;

          proxy_cache my_cache;
          proxy_cache_valid 200 301 302 304 3h;
          proxy_cache_valid any 0;
          proxy_cache_use_stale updating error timeout invalid_header http_500 http_502 http_503 http_504 http_404;
          proxy_ignore_headers "Cache-Control" "Expires";
          proxy_cache_key "$scheme|$proxy_host|$uri|$is_args|$args";

          expires -1;
          add_header Last-Modified $sent_http_Expires;
        }

        location /get_user_info/ {
          rewrite  ^/get_user_info/(.*)$  /$1  break;
          
          proxy_pass http://192.168.0.1:81/;
          proxy_pass_header Cookie;

          proxy_cache my_cache;
          proxy_cache_valid 200 301 302 304 3h;
          proxy_cache_valid any 0;
          proxy_cache_use_stale updating error timeout invalid_header http_500 http_502 http_503 http_504 http_404;
          
          proxy_hide_header "Set-Cookie";
          # Кешируем страницу в любом случае, забив на заголовки
          proxy_ignore_headers "Cache-Control" "Expires";
          proxy_cache_key "$scheme|$proxy_host|$uri|$is_args|$args|$cookie_sid";

          expires -1;
          add_header Last-Modified $sent_http_Expires;
        }
}

Posted at Nginx Forum: http://forum.nginx.org/read.php?21,17302,17302#msg-17302






More information about the nginx-ru mailing list