Я работаю над платформой электронной коммерции, которая имеет динамический контент для зарегистрированных пользователей, но для вышедших из системы пользователей многие страницы, такие как страницы продуктов и страницы категорий, относительно статичны.
Rails был настроен для сохранения копий определенных страниц, вышедших из системы, на диск при доступе.
Я бы хотел, чтобы nginx обслуживал эти файлы, когда обнаруживал вышедшего из системы пользователя. У нас есть файлы cookie, которые устанавливаются для пользователей, когда они входят в систему, поэтому я надеялся, что смогу проверить это.
Моя «идеальная» конфигурация nginx будет выглядеть примерно так (в серверном блоке):
location /my_location {
if (!$cookie_user_logged_in) {
try_files /cached_pages/$uri /cached_pages/$uri.html $uri $uri/index.html $uri.html @rails_application;
}
}
Однако это неверно, потому что, насколько я могу судить, основываясь на исследованиях и сообщениях об ошибках, нельзя поместить try_files в if.
Есть ли способ сделать это с помощью nginx?
Мне сказали, что я должен сделать это с помощью другого инструмента, например, Varnish. Я также знаю, что могу делать что-то с кешированием действий в Rails и кешированием фрагментов, чтобы приблизиться к той же цели. Однако я хотел бы определить, является ли это жизнеспособным вариантом, прежде чем добавлять его в стек технологий или инвестировать в дальнейшие разработки.
Я не пробовал использовать try_files внутри if, но приведенный ниже код мне подходит. По сути, он реплицирует соединение php-fpm в этом конкретном месте {}, если проверка cookie прошла успешно. Он разрешает неаутентифицированный доступ к admin-ajax.php и запрещает несанкционированный доступ ко всему остальному в / wp-admin /
Далее в файле конфигурации есть location ~\.php {...}
блок, который обычно обрабатывает запросы php.
location ~ /wp-admin/ {
set $adminok 0;
if ($http_cookie ~* "admincookie" ) {
set $adminok 1;
}
if ($request_filename ~* "admin-ajax.php" ) {
set $adminok 1;
}
if ($adminok != 1) {
return 403;
}
include fastcgi_params;
if (-f $document_root$fastcgi_script_name) {
set $doc $document_root$fastcgi_script_name;
}
if (!-f $document_root$fastcgi_script_name) {
set $doc $document_root/wp-admin/index.php ;
}
fastcgi_param SCRIPT_FILENAME $doc ;
fastcgi_pass unix:$server_unix_socket ;
fastcgi_cache_bypass 1;
}