Здравствуйте, уважаемые автоматизаторы и веб-мастера!
Пока что не касаюсь вопроса кеширования - это будет следующим этапом.
Бьюсь с сессией и ПОЧТИ её ПОБЕДИЛ. Но, как всегда, есть "нюанс".
Читал много статей, где умные головы советуют не бороться с сессией.
Однако, меня мучает вопрос по отдаче статики без куков, но в тоже время без редиректов на другой домен и без потери функциональности от полного отказа от 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]
<form action="/booking.html" method="post" name="emailForm" id="emailForm" class="form-validate">
бла-бла-бла
<input type="hidden" name="option" value="com_contact" />
<input type="hidden" name="view" value="contact" />
<input type="hidden" name="id" value="1" />
<input type="hidden" name="task" value="submit" />
<input type="hidden" name="85be079f0cc070e6c88692537fc8e31d" value="1" />
</form>
[/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 при следующем запросе от клиента попытался бы мне подсунуть совершенно другую "отсебятину", не соответствующую тому, что я передал ему для клиента в ответе на самый первый запрос. Если не прав, прошу меня поправить.
Прошу поделиться опытом, как сие дело успешно разрешить.