Я на Nginx 0.8.54 стараясь добиться следующего как можно СУХОГО:
localhost:8060
если куки no_cache
является true
или если метод запроса не GET
.$document_root/static/$uri
.$document_root/cache/$uri
и $document_root/cache/$uri.html
./
, попробуйте не статические файлы, а только $document_root/cache/index.html
.localhost:8060
если не найдены ни статические, ни кешированные файлы.Текущий файл конфигурации:
server {
root /srv/web/example.com;
server_name example.com;
location @backend { proxy_pass http://localhost:8060; }
location / {
if ($cookie_no_cache = true) { proxy_pass http://localhost:8060; }
if ($request_method != GET) { proxy_pass http://localhost:8060; }
try_files /static/$uri /cache/$uri /cache/$uri.html @backend;
}
location = / {
if ($cookie_no_cache = true) { proxy_pass http://localhost:8060; }
if ($request_method != GET) { proxy_pass http://localhost:8060; }
try_files /cache/index.html @backend;
}
}
http {
map $cookie_no_cache $cacheZone {
default "";
true X;
}
server {
root /srv/web/example.com;
server_name example.com;
error_page 405 = @backend;
location / {
try_files /cache$cacheZone/$uri.html /static$cacheZone/$uri
/cache$cacheZone/$uri @backend;
}
location @backend {
proxy_pass http://localhost:8060;
}
}
}
Объяснение.
map
. Переменная $cacheZone
зависит от стоимости $cookie_no_cache
. По умолчанию он пуст, но если есть файл cookie "no_cache = true", мы устанавливаем $cacheZone
на любое значение, чтобы изменить путь поиска статического файла в try_files
- надеюсь у тебя нет /cacheX
и /staticX
папки в корне вашего сервера (если да, выберите другое значение для $cacheZone
)PUT
или POST
в статические файлы (это бессмысленно), поэтому в этом случае он выдает ошибку HTTP 405 «Не разрешено». Мы перехватываем это error_page
и передайте запрос @backend
расположение.Альтернативный подход
В противном случае используйте proxy_cache
:
http {
proxy_cache_path example:1m;
server {
root /srv/web/example.com;
server_name example.com;
location / {
proxy_cache example;
proxy_cache_bypass $cookie_no_cache;
proxy_cache_valid 200 10s;
proxy_pass http://localhost:8060;
}
}
}