2014-11-14 25 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; 
    }