我上线了Nginx 0.8.54尝试尽可能地 DRYly 地实现以下目标:
localhost:8060
如果 cookieno_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;
}
}
答案1
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;
}
}
}
解释。
- 关于“no_cache”cookie 检查。我们将其替换为 Nginx
map
。变量$cacheZone
取决于 的值$cookie_no_cache
。默认情况下它是空的,但如果有“no_cache=true”cookie,我们会将其设置$cacheZone
为任何值来修改 中的静态文件搜索路径——我希望您的服务器根目录下try_files
没有/cacheX
和文件夹(如果是,请选择 的另一个值)/staticX
$cacheZone
- Nginx 无法将 HTTP 方法
PUT
应用于POST
静态文件(这毫无意义),因此在这种情况下它会发出 HTTP 错误 405“不允许”。我们通过拦截它error_page
并将请求传递给@backend
location。
替代方法
否则,使用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;
}
}
}