nginx 如何拥有 try_files 的动态顺序

Joe*_*984 0 nginx

我不知道如何更好地表达这个问题,所以让我知道是否有更好的方法,但这是我想要做的。

我有一个应用程序,它根据请求 url 发送一个 html 文件,它还在缓存文件夹中创建该 html 文件的缓存,以便 nginx 可以在下次有人访问相同的 url 时提供缓存文件。

这是按预期工作的,除了我不希望在有查询参数时 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;
    }
Run Code Online (Sandbox Code Playgroud)

那么当 url 中有查询参数时,我如何try_files绕过content/cache/$uri.html并直接转到@app

Mic*_*ton 6

其他人可能会想到一些复杂的事情,if但我认为我有一个非常简单的解决方案。

您的应用程序使用 URL 路径(不带查询参数)作为文件名缓存文件。如果请求的 URL 具有查询字符串,则您不想使用缓存。

nginx 有一个变量$is_args,如果没有查询字符串,则该变量为空,如果有查询字符串,则包含一个变量?。你可以简单地合并这个:

        try_files /content/cache/$uri.html$is_args @app;
Run Code Online (Sandbox Code Playgroud)

因此,如果 URL 包含查询字符串,则 nginx 尝试的路径将附加 a?并且将与文件不匹配。然后请求将传递到您的应用程序。