Nginx, не соблюдая должен - подтверждать

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

Я использую Amazon S3 в качестве сервера источника, и я использую подписанные URL для защиты содержания. Таким образом, каждый пользователь получает уникальный URL, который истекает после определенного времени. Даже жесткий у каждого пользователя есть уникальный URL, для создания nginx кэша содержанием независимо, я определил ключ кэша как только состоящий из имени файла запроса (см. конфигурацию ниже).

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

Я подтвердил, что начальный запрос должен содержать действительную подпись. Если signture в пользовательском запросе недопустим, nginx не может выбрать его с сервера (конечно).

Теперь то, что я хочу иметь, является перепоиском файла по каждому запросу. Этот поиск ре должен произойти с URL, который указал пользователь. Если запрос успешен, кэшируемый файл должен быть поставлен.

Это - точно поведение, которое должно быть выполнено с помощью Cache-control: must-revalidate

Таким образом, я настроил этот заголовок на своем сервере источника (Amazon S3).

Я затем понял, что nginx не ведет себя соответственно.

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

Вопрос 1: существует ли способ сделать заголовки должен-придания-вновь-юридической-силы чести nginx в этом контексте?

Вот мой файл конфигурации

proxy_cache_path /home/sbgag/cache keys_zone=MYZONE:10m inactive=365d max_size=10g;
server {
        listen       80;
        server_name test.mydomain.com;
        location / {
                proxy_pass          http://s3-eu-west-1.amazonaws.com;
                proxy_set_header    Host s3-eu-west-1.amazonaws.com;
                proxy_set_header    X-Real-IP $remote_addr;
                proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_cache_key         "$request_filename";
                more_set_headers "X-My-Proxy-Cache-Key $request_filename";
                more_set_headers "X-My-Proxy-Cache-realpath_root $realpath_root";
                more_set_headers "X-My-Proxy-Cache-uri $uri";
                proxy_cache            MYZONE;
                proxy_cache_valid      200  365d;
                proxy_cache_use_stale  error timeout invalid_header updating http_500 http_502 http_503 http_504;
                more_set_headers "X-AppServer $upstream_addr";           # Backend Server / Port
                more_set_headers "X-AppServer-Status $upstream_status";  # Backend HTTP Status
                more_set_headers "X-Cache $upstream_cache_status";       # HIT / MISS / BYPASS / EXPIRED
        }
}

Также я нашел этот журнал изменений

*) Feature: the "proxy_cache_revalidate", "fastcgi_cache_revalidate",
   "scgi_cache_revalidate", and "uwsgi_cache_revalidate" directives.

Таким образом, я думал, что играю с ним. После обеспечения моего nginx до новейшей версии я установил свое время кэша на 0s. С 0s никогда не кэшируется файл, таким образом, я установил его на 1 с.

Это производит почти поведение, которое я хочу. Это заставляет файл быть подтвержденным на сервере после 1 с. Это - затем ре, проверенное с URL со знаком предоставленный пользователь. Если это неправильно, то это перестало работать. Также файл не удален, потому что nginx, кажется, удаляет файлы не сразу, но только когда пространство становится полным. Таким образом, даже если приведенный к таймауту файл и даже если другой клиент предоставил недопустимый URL, следующий клиент с допустимым URL, может загрузить с кэша.

В 1 втором timefrime однако все могут загрузить, но hta это не действительно беспокойство мне.

Хорошо, таким образом, это почти, что я хочу, что я не люблю, то, что это - ужасная работа вокруг этого, основан на поведении, которое более случайно, чем funcitonal.

Вопрос 2: Нет ли лучший путь?

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

Maby даже переписать правило сделал бы. Перезапись к сценарию с переписать картой и только вывод URL, когда проверка имела успех.

Любой вход ценится!

3
задан 9 January 2014 в 19:14
1 ответ

Saya rasa apa yang Anda cari sebenarnya menambahkan ini:

proxy_cache_bypass $ http_cache_control;

Dengan cara ini mengirim permintaan dengan set Cache-Control: must-revalidate header akan melewati cache.

1
ответ дан 3 December 2019 в 07:30

Теги

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