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