2014-11-14 21 views
3
upstream app { 
    server localhost:3000; 
} 

server { 
    ... 
    # If I comment this location out, images are displayed on the website 
    location ~* \.(?:jpg|jpeg|png|gif|swf|xml|txt|css|js)$ { 

     expires 6004800; 
     add_header Pragma public; 
     add_header Cache-Control "public, must-revalidate, proxy-revalidate"; 
    } 
    ... 
    location /app { 
     alias /path/to/app/public/; 
     try_files $uri $uri @app; 
    } 

    location @app { 
     rewrite /app(.*) $1 break; 

     proxy_set_header X-Real-IP $remote_addr; 
     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
     proxy_set_header Host $proxy_host; 
     proxy_set_header X-NginX-Proxy true; 

     proxy_pass http://app; 
     proxy_redirect http://app/ /app/; 
    } 
    ... 
} 

我在这方面挣扎了一段时间。我在nginx下的子文件夹中有一个快速应用程序。以上是我在/ sites-available /中的nginx文件中的代码。当我删除静态文件的位置时,应用程序的图像和css被代理,但是如果静态文件缓存位于nginx文件中,则快速应用程序的图像和css文件不会显示在网站上。与nginx快递js应用 - 服务子文件夹时与静态文件的冲突

请问有人可以帮忙吗?

回答

3

正则表达式位置优先于nginx请求处理中的前缀位置块。以下是nginx的location directive documentation的相关摘录。

我强烈建议您仔细阅读,因为许多人不这样做,错过了基本知识。

几个例子之前了解关键字:

  • 前缀的位置:location /toto { [...] }
  • 正则表达式的位置:location ~ /toto { [...] }

[...]

要找到位置匹配给定的请求,nginx首先检查使用pre定义的位置修复字符串(前缀位置)。其中,选择并记住具有最长匹配前缀的位置。然后按照它们在配置文件中出现的顺序检查正则表达式。正则表达式的搜索在第一次匹配时终止,并使用相应的配置。如果找不到与正则表达式的匹配,则使用先前记住的前缀位置的配置。

[...]

如果最长前缀匹配的位置有“^〜”修饰符,然后正则表达式不检查。

[...]

此外,使用“=”改性剂,可以定义URI和位置的精确匹配。如果找到完全匹配,则搜索结束。 [...具有比正则表达式的位置

  • location = /toto { [...] }更高的优先级前缀位置::]

  • 其他一些例子来说明两个操作符来修改位置查找顺序:

    • location ^~ /toto { [...] }确切前缀位置(精确匹配,最高优先级)

    总结一下,传入请求URI的位置选择期间的优先级列表是:

    1. location = /too
    2. location ^~ /toto
    3. location ~ /toto
    4. location /toto

    所以解决您的问题更清洁的方式使用:

    location ^~ /app { 
        alias /path/to/app/public/; 
        try_files $uri $uri @app; 
    }