使用 nginx/web2py 实现浏览器缓存时静态资产出现 404 错误

404 error for static assets when browser caching is implemented with nginx/web2py

我有一个在 nginx 上运行的 web2py 配置,当为某些静态文件实现浏览器缓存时,它会产生 404 错误。问题已描述 here,我现在在 web2py 上下文中问这个问题,因为这可能与问题相关,或者因为可能有一些特定于 web2py 的解决方法或解决方案。

nginx.conf 看起来像这样:

worker_processes  3;

events {
    worker_connections  1024;
}

http {
    access_log  [/...];
    error_log   [/...]  crit;

    include mime.types;
    sendfile on;

    server {
        server_name [...] [...];
        return 301 [...] $request_uri;
    }

    server {
        listen 127.0.0.1:[...];
        root [/...];

        location / {
            include uwsgi_params;
            uwsgi_pass [.../uwsgi.sock];
        }
    }
}

在上面的 "location" 子句之前或之后添加以下行会导致服务器停止提供静态文件,这些文件与所讨论的模式相匹配:

location ~*  \.(jpg|jpeg|png|gif|ico|css|js)$ {
    expires 1d;
}

在上一个线程中有人建议这可能是一个 uwsgi 问题,尽管该问题可能是由其他问题引起的。如何实现浏览器缓存而不导致“404”问题?

在我看来,您只提供动态内容。另外,nginx选择location块到process a request,需要完成。

在您的情况下,location / 块中的 uwsgi 配置需要复制到您可能添加的任何新动态位置。例如:

server {
    ...

    include uwsgi_params;

    location / {
        uwsgi_pass [.../uwsgi.sock];
    }
    location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
        expires 1d;
        uwsgi_pass [.../uwsgi.sock];
    }
}

您可以将 include 语句移动到外部块并允许其语句被继承(假设它只包含 uwsgi_param 语句)。