如何在nginx中使用基于$ uri的动态根路径?

时间:2016-09-24 11:54:54

标签: django nginx uwsgi

我在一台服务器上托管多个django应用程序。

用户访问时:http://dev-app.example.com/testapp1

我需要使用从$ uri动态生成的根路径来提供/ static,因为我没有在应用程序中使用相同的资源,而是使用相同的路径。

我的nginx配置文件树:

nginx
├── sites-enabled
│   ├── myconf
│   myapps/
│   ├── testapp1
│   └── testapp2

myconf文件:

server {
    listen 8088;
    server_name dev-app.example.com;

    location = favicon.ico { access_log off; log_not_found off; }

    location /static 
        # The line below isn't working even if the $uri has the string I want to concatenate
        root /home/user$uri/current;
    }

    include /etc/nginx/myapps/*;
}

testapp1文件:

location /testapp1 {
    include uwsgi_params;
    uwsgi_pass unix:/home/user/testapp1/current/testapp1.sock;
}

testapp2文件:

location /testapp2 {
    include uwsgi_params;
    uwsgi_pass unix:/home/user/testapp2/current/testapp2.sock;
}

我想使用nginx内置变量$ uri在myconf文件中为每个请求的应用程序构建我的/ static位置的根路径。

当用户打开http://dev-app.example.com/whatever时,我想提供此服务:

# In the myconf file
location /static {
     root /home/user/whatever/current;
}

2 个答案:

答案 0 :(得分:0)

设置每个服务器块内的静态位置

server {
  listen 80;

  server_name pool.simlabdevelopments.com; 
  root /srv/http/simlabdevelopments.com;

  location /static/ {
    alias   /srv/webapps/autopool/static/;
  }
}

答案 1 :(得分:0)

这不会那样。

首先,您必须了解HTTP请求的工作原理。您的网站或静态文件的每个请求都是独立的,并且拥有自己的URL。 Nginx无法自行配对静态文件请求从中请求静态文件的网站...

nginx可能知道的唯一方法是Referer标头,浏览器可以将请求发送到静态文件。这可能包含从中请求静态文件的Web文档的路径,但它也可以是空的!它也可以只包含您网站的根路径。

此外,浏览器会尝试缓存他们可以使用的所有内容,因此,如果用户访问http://example.com/testapp1并且该网站包含http://example.com/static/style.css的引用,则浏览器会将其缓存并根据请求向http://example.com/testapp2浏览器获取不要下载新的css文件,而是使用缓存的文件。

如果您确定您的网络客户端始终发送正确的Referer标头并且不会缓存任何静态文件,您可以尝试从nginx中的$http_referer变量中提取应用程序的路径。< / p>