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