我不知道如何更好地表述这个问题,所以如果有更好的方法请告诉我,但这是我想要做的。
我有一个应用程序,它根据请求url发送一个html文件,它还在缓存文件夹中创建该html文件的缓存,以便下次有人访问同一个url时,nginx就可以提供缓存的文件。
这按预期工作,只是我不希望在有查询参数时 nginx 读取缓存。当发生这种情况时,我希望应用程序能够处理请求,但缓存会被发送。以下是我目前的情况:
location / {
root /path/to/site;
try_files /content/cache/$uri.html @app;
}
location @app {
proxy_set_header Host $host;
proxy_pass http://127.0.0.1:8080;
}
那么,当 URL 中有查询参数时,我该如何绕过try_files
并content/cache/$uri.html
直接转到?@app
答案1
其他人可能会想到一些复杂的事情,if
但我认为我对此有一个非常简单的解决方案。
您的应用程序使用 URL 路径(不带查询参数)作为文件名来缓存文件。如果请求的 URL 包含查询字符串,则您不想使用缓存。
nginx 有一个变量$is_args
,如果没有查询字符串,则为空;?
如果有查询字符串,则包含一个。您可以简单地合并以下内容:
try_files /content/cache/$uri.html$is_args @app;
因此,如果 URL 包含查询字符串,nginx 尝试的路径将附加一个,?
并且不会匹配该文件。然后请求将传递给您的应用程序。