nginx别名不适用于静态文件文件夹

时间:2016-12-01 10:15:33

标签: django nginx

我不知道为什么nginx别名不起作用。

为什么这条线不起作用:

location /static/  {
            alias /home/django11/example.com/finansuinfo/static_root/;
        }

实际上它可能正常工作但我的管理页面静态文件没有服务。我收到static / admin / ...不存在的错误。

我猜它只提供静态文件夹中的文件,但不提供static_root文件夹,其中所有文件都是由manage.py collectstatic收集的

这是我的配置:

server {
listen 80;
server_name example.com www.example.com;
root /home/django11/example.com/example;

location / {
    include         uwsgi_params;
    uwsgi_pass      unix:/home/django11/example.com/example/example.sock;
}

location /static/  {
    alias /home/django11/example.com/example/static_root/;
}

# Media: images, icons, video, audio, HTC
location ~* \.(?:jpg|jpeg|gif|png|ico|cur|gz|svg|svgz|mp4|ogg|ogv|webm|htc)$ {
  expires 1M;
  access_log off;
  add_header Cache-Control "public";
}

# CSS and Javascript
location ~* \.(?:css|js|woff)$ {
  expires 1M;
  access_log off;
  add_header Cache-Control "public";
}

}

我发现别名因为以下原因而无效:

# Media: images, icons, video, audio, HTC
    location ~* \.(?:jpg|jpeg|gif|png|ico|cur|gz|svg|svgz|mp4|ogg|ogv|webm|htc)$ {
      expires 1M;
      access_log off;
      add_header Cache-Control "public";
    }

    # CSS and Javascript
    location ~* \.(?:css|js|woff)$ {
      expires 1M;
      access_log off;
      add_header Cache-Control "public";
    }

您有什么建议如何解决?因为当我删除这个static_root时。

1 个答案:

答案 0 :(得分:2)

查看nginx中location config的文档:

  

位置可以由前缀字符串或正则表达式定义。使用前面的“〜*”修饰符(对于不区分大小写的匹配)或“〜”修饰符(对于区分大小写的匹配)指定正则表达式。 要查找与给定请求匹配的位置,nginx首先检查使用前缀字符串(前缀位置)定义的位置。其中,选择并记住具有最长匹配前缀的位置。 然后按照它们在配置文件中的出现顺序检查正则表达式。正则表达式的搜索在第一次匹配时终止,并使用相应的配置。如果找不到与正则表达式的匹配,则使用先前记住的前缀位置的配置。

您问题中的案例可以从中解释:

当您尝试访问静态文件(我猜是css,js或media文件之一)时,它首先匹配前缀字符串

location /static/  {
    alias /home/django11/example.com/example/static_root/;
}

然后,它开始搜索正则表达式,如果下面的css或js文件将获得匹配:

# CSS and Javascript
location ~* \.(?:css|js|woff)$ {
  expires 1M;
  access_log off;
  add_header Cache-Control "public";
}

搜索终止并使用上述配置。并且,在此配置中,别名未定义,因此不使用别名。

删除此正则表达式位置块时,将使用前缀位置的配置。并且,由于这包括别名,它可以工作。