Re: Изменить заголовок(и) set-cookie после получения ответа от backend'а
roga_i_kopita
nginx-forum на nginx.us
Вт Ноя 23 13:52:03 MSK 2010
Здравствуйте, уважаемые
автоматизаторы и веб-мастера!
Пока что не касаюсь вопроса
кеширования - это будет следующим
этапом.
Бьюсь с сессией и ПОЧТИ её ПОБЕДИЛ. Но,
как всегда, есть "нюанс".
Читал много статей, где умные головы
советуют не бороться с сессией.
Однако, меня мучает вопрос по отдаче
статики без куков, но в тоже время без
редиректов на другой домен и без потери
функциональности от полного отказа от
session_start().
[quote="Если сессия нужна всегда - тогда
стартуйте ее всегда и НЕ боритесь с
сессионной кукой. Если сессия не нужна
всегда - не стартуйте ее всегда
и, опять же НЕ боритесь с сессионной
кукой."]
Такой вариант не канает - сессия в
рамках одного и того же сайта где-то
нужна, а где-то нет.
[/quote]
NGINX 0.7.64, FastCGI, eAccelerstor, memcached, JOOMLA 1.5.22.
В общем сделал так:
Предварительно в php.ini директиву
session.cookie_path установил с пустым
значением (было / ). Т.е. куки ставятся
для того пути (каталога), который был
запрошен, а не сплошняком на весь сайт.
[code]
server {
server_name www.domain.travel;
root /var/www/sites/domain.travel;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
fastcgi_hide_header "Set-Cookie";
valid_referers none blocked server_names *.domain.travel;
location / {
try_files $uri @not_found;
}
location /administrator {
index index.php;
error_page 403 =404;
try_files $uri/ @not_found;
fastcgi_pass_header "Set-Cookie";
location ~* /administrator/index2?\.php$ {
include /etc/nginx/fastcgi_default;
}
location ~* \.(css|js|gif|ico|jpg|png)$ {
rewrite ^
$scheme://static.simba.travel$request_uri permanent;
}
location ~* \.php$ {
error_page 404 = @not_found;
return 404;
}
}
location ~* \.php$ {
try_files $uri @not_found;
include /etc/nginx/fastcgi_default;
}
location ~*
\.(css|js|gif|jpg|jpeg|png|ico|eot|svg|otf|ttf|woff|pdf|doc|xls)$ {
if ($invalid_referer) {return 404;}
expires 1d;
add_header Cache-Control public;
}
location @not_found {
include /etc/nginx/fastcgi_default;
fastcgi_param SCRIPT_FILENAME $document_root/index.php;
fastcgi_param SCRIPT_NAME /index.php;
}
}
server {
server_name static.domain.travel;
root /var/www/sites/domain.travel;
access_log off;
log_not_found off;
fastcgi_hide_header "Set-Cookie";
location / {return 404;}
location ~* \.(css|js|gif|ico|jpg|png)$ {
expires max;
add_header Cache-Control public;
}
}
[/code]
Иными словами: заголовки с куками прячу
для всего сайта, но выдаю куки для пути
/administrator.
Чтобы можно было залогиниться и
работать в админке сайта.
При навигации по статьям на морде сайта
куков нет - отслеживаю через firebug и
встроенные инструменты разработчика в
Chrome.
Запросы статики по пути ~*
/administrator/.*\.(css|js|gif|ico|jpg|png)$ перенаправляю
в другой server, где куки выключены.
Обработку любых .php, кроме index.php и index2.php
в админке запрещаю, а также
просматривать структуру каталогов в
адресной строке тоже запрещаю - все нах,
на главную! Планирую для этого location
включить SSL.
В остальных location всё стандартно. Куки
вырублены.
Так вот, [b]нюанс в том[/b], что всё это
прекрасно работает, до той поры, пока не
появляется необходимость с морды сайта
через форму методом POST отправить
сообщение.
[b]Куки нужны, а КАК их включить ТОЛЬКО
для этой формы (путь /booking.html) - не могу
придумать.[/b]
[code]
бла-бла-бла
[/code]
Идеи такие:
1. Куки на уровне server НЕ отключать. В
каждом location, где это нужно, подключать
перловый модуль и парсить заголовки
запросов клиентов и ответов FastCGI. Т.е.
там, где не нужно ставить fastcgi_hide_header
"Set-Cookie". А там, где куки нужны этим
модулем вручную менять path на нужное
значение путём использования
$r->header_in(строка), $r->header_out(строка,
значение).
Буду благодарен, если знающие люди
подскажут, как конкретно это сделать, у
самого опыта и знаний для написания
этого кода не хватает.
В моём случае для этого дополнительно
надо пересобрать nginx с поддержкой
ngx_http_perl_module и ngx_http_ssi_module.
2. Куки на уровне server отключить. В нужных
местах их генерить самостоятельно
непосредственно в location. Только опять же
не знаю, как в конфиг server воткнуть код php
для генерации куки. Да и по-моему это
бредовая идея. Если не ошибаюсь, куки
обрабатывает php, а не nginx. Nginx их просто
передаёт в заголовках.
Соответственно на месте php я бы сильно
удивился, если бы при первом запросе
сгенерил куку и передал бы её nginx'у для
клиента. А nginx при следующем запросе от
клиента попытался бы мне подсунуть
совершенно другую "отсебятину", не
соответствующую тому, что я передал ему
для клиента в ответе на самый первый
запрос. Если не прав, прошу меня
поправить.
Прошу поделиться опытом, как сие дело
успешно разрешить.
Posted at Nginx Forum: http://forum.nginx.org/read.php?21,61561,152615#msg-152615
Подробная информация о списке рассылки nginx-ru