Как настроить nginx для обслуживания из файла на основе cookie

Я работаю над платформой электронной коммерции, которая имеет динамический контент для зарегистрированных пользователей, но для вышедших из системы пользователей многие страницы, такие как страницы продуктов и страницы категорий, относительно статичны.

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.

Is Есть ли способ сделать это с помощью nginx?

Мне сказали, что я должен сделать это с помощью другого инструмента, такого как Varnish. Я также знаю, что могу делать что-то с кешированием действий в Rails и кешированием фрагментов, чтобы приблизиться к той же цели. Однако я хотел бы определить, является ли это жизнеспособным вариантом, прежде чем добавлять его в технологический стек или инвестировать в дальнейшие разработки.

0
задан 16 November 2017 в 23:50
1 ответ

Я не пробовал использовать файлы try_files внутри if, но приведенный ниже код мне подходит. По сути, он реплицирует соединение php-fpm в этом конкретном месте {}, если проверка cookie прошла успешно. Он разрешает неаутентифицированный доступ к admin-ajax.php и запрещает несанкционированный доступ ко всему остальному в / wp-admin /

Далее в конфигурационном файле есть расположение ~ \ .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;
        }
0
ответ дан 5 December 2019 в 07:08

Теги

Похожие вопросы