【问题标题】:Nginx cache static files from different aplicationsNginx 缓存来自不同应用程序的静态文件
【发布时间】:2017-07-18 11:45:56
【问题描述】:

我使用 WordPress 作为主页 (mysite.com),其余部分使用 Django (mysite.com/pages)。我对它们都有一个 nginx 配置文件,并且工作正常。此外,它们位于单个 server 块中。

这是我的配置的一些部分:

server {
    ...
    root /var/www/wordpress;
    ...
    location /static/ {
        alias  /home/username/Env/virtenv/mysite/static/;
    }
}

这样,WordPress 和 Django 静态文件都可以使用。 现在我想在浏览器中缓存所有静态文件 7 天。如果我加上这个:

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

然后 WordPress 静态文件被正确缓存,但 Django 的静态文件甚至没有服务。

我知道这是因为永远无法到达 /static/ 位置,然后 Nginx 在 root 指令中搜索 Django 的文件,该指令位于 server 块级别并指向 WordPress 位置。

我可以删除缓存位置并在/static/location 中添加expires 7d;。这将只缓存 Django 的静态文件。

但是我怎样才能让两个静态资源都缓存一周呢?

【问题讨论】:

  • 我将expires 7d; 放入/static/,结果还是一样。 Nginx 不提供/static/ 中的资源,因为如果在location ~* \.(jpg|jpeg|png 中搜索它们。
  • 您能分享一下您可以提出什么样的替代解决方案吗?

标签: caching nginx


【解决方案1】:

最后,我能够缓存 Wordpress 和 Django 的两个静态文件。 对于以/static/开头的请求,我找到了一种方法让Nginx使用/static/location而不是一般的静态文件location,它的目的是只缓存Wordpress静态文件。

很简单:只需使用位置修饰符^~

正如DigitalOcean 的这篇精彩文章所说:

block修饰符^~表示如果这个block被选为最佳的非正则表达式匹配,则不会进行正则表达式匹配。

这是两个位置块的工作版本:

location ~*  \.(?:jpg|jpeg|png|svg|gif|ico|css|js)$ {
    # Cache Wordpress or any other public static files
    # of those types for a week in the browser
    expires 7d;
}

location ^~ /static/ {
    alias  /home/username/Env/virtenv/mysite/static/;
    # Cache Django's static files for a week in the browser
    expires 7d;
}

所有带有mysite.com/static/... 的请求都将匹配 /static/ 位置,并且不会继续到任何其他正则表达式位置。

例如请求mysite.com/wp-content/themes/a-theme/style.css?ver=4.7.2 将匹配正则表达式位置。

【讨论】:

    猜你喜欢
    • 2011-02-03
    • 1970-01-01
    • 2020-08-06
    • 2014-07-19
    • 2011-09-18
    • 1970-01-01
    • 1970-01-01
    • 2012-09-02
    • 2015-08-10
    相关资源
    最近更新 更多