nginx 根据代理内容的 mime 类型指定 Expires 标头吗?

nginx 根据代理内容的 mime 类型指定 Expires 标头吗?

我的设置使用映射来Expires为各种静态文件定义不同的标头(基于其 mime 类型)。对于代理内容(uwsgi_pass),我使用静态Expires标头:

map $sent_http_content_type $expires {
    default                    off;
    text/html                  7d;
    text/css                   180d;
    application/font-woff2      1y;
    application/pdf             1y;
    ~image/                     1y;
}

server {
    listen       443 ssl http2;
    server_name  example.com;
    
    location / {
            uwsgi_pass django;
            expires 7d;
    }
    
    location ~ ^/(css|fonts|images|pdf|html)/ {
            root /var/www/django/static/;
            expires $expires;
    }
}

使用映射(通过变量$expires)来处理代理内容不起作用。nginx 是否有任何方法可以识别代理内容的 mime 类型,以便使其正常工作?

location / {
        uwsgi_pass django;
        expires $expires;
}

(编辑)正如 Alexey 建议的那样,我这样做了:

map $upstream_http_content_type $expires2 {
         default                    off;
         text/html                  2d;
         text/plain                  20d;
         text/css                   180d;
}

location / {
        uwsgi_pass      django;
        expires $expires2;
}

Expires不幸的是,通过 uwsgi 传递的内容仍然没有添加标头。

答案1

解决方案由 Alexey 和 Richard 在评论中提供。我必须使用不同的 nginx 变量,以及(至少)用于 HTML 文件的映射条目的正则表达式:

map $upstream_http_content_type $expires2 {
         default                    off;
         ~text/html                  2d;
         text/plain                  20d;
         text/css                   180d;
}

location / {
        uwsgi_pass      django;
        expires $expires2;
}

相关内容