簡體   English   中英

Nginx:從不同的根和位置提供JPG圖像

[英]Nginx : Serve JPG images from different root and location

我有3個不同的庫存區域:“頭像”,“文章”,“趨勢”,我存儲我的圖像。

我想將URL“/trends/123.jpg”鏈接到trend文件夾,將“/avatars/23.jpg”鏈接到avatar等等。

配置1:

server
{
    listen 8089;
    server_name localhost;

    root /var/www;

    location /trends/
    {
            alias  /var/storage/hottrend/;
    }

    location ~* ^.+\.(jpeg|gif|png|jpg)
    {
            add_header Cache-control "public";
            access_log   off;
            expires      90d;
    }
}

配置1:“GET /trends/123.jpg”從不匹配/趨勢/位置,為什么?

配置2:

server
{
    listen 8089;
    server_name localhost;

    root /var/www;

    location ~ ^/trends/(.*)\.jpg$
    {
            rewrite ^/trends/(.*)$ /$1 break;

            root  /var/storage/hottrend;
    }

    location ~* ^.+\.(jpeg|gif|png|jpg)
    {
            add_header Cache-control "public";
            access_log   off;
            expires      90d;
    }
}

配置2:與緩存內容的最后一條規則不匹配。 從不同位置/根服務器JPG文件的最佳方法是什么?

這兩種配置有不同但相關的問題。 這兩個問題是:

  1. 地點的順序是匹配的;
  2. 匹配位置時會發生什么。

我將首先解釋它是如何工作的,然后我將解決您的配置問題。

這個怎么運作

位置匹配

你可以在這個nginx wiki頁面找到詳細信息,但我總是發現這個措辭令人困惑。 (它在行為描述中混合了實現細節。)這意味着位置按以下順序匹配:

  1. 精確匹配,如location = /robots.txt
  2. 急切的非正則表達式前綴如location ^~ /trends/
  3. 正則表達式匹配location ~* \\.(jpg|png) ,或區分大小寫的location ~ \\.(jpg|png)
  4. 懶惰的非正則表達式前綴,如location /trends/location /

如果多個正則表達式匹配,則第一個匹配勝過其他正則表達式。 如果多個非正則表達式前綴匹配,我認為它選擇最具體的匹配 - 我將檢查並更新。

位置行為

匹配位置負責提供指定的內容。 它還負責提供緩存控制頭等。 您可以使用與特定網址格式匹配的位置來應用特定標頭,但該位置也必須提供內容。 如果它無法提供內容,您很可能會收到404錯誤 - 它不會查找其他匹配位置。

最后,如果您在某個位置重寫,請格外小心。 內部重定向可以比某些指令更早發生,在這種情況下,在重定向導致再次搜索位置之前,這些指令可能不適用。

配置1

您的趨勢位置是一個惰性非正則表達式前綴,因此只有在正則表達式位置無法匹配時才會匹配。 您可以通過使用急切的非正則表達式匹配來解決此問題,例如

location ^~ /trends {
    ...
}

但是,這樣做會突出顯示其他配置問題。

配置2

您有兩個可能與jpg文件匹配的位置。 只有一個會成功。 如果第一個匹配,則不應用第二個位置的緩存控制。 如果第二個匹配,則別名不會生效。

修復是為了確保所需的所有指令都應用於​​匹配的位置。 您可以在一個文件中顯式,例如

location ^~ /trends
{
    alias /var/storage/hottrend;

    add_header Cache-control "public";
    access_log   off;
    expires      90d;
}

location ~* ^.+\.(jpeg|gif|png|jpg)
{
    add_header Cache-control "public";
    access_log   off;
    expires      90d;
}

用於管理必須應用於多個位置的指令的更簡潔的解決方案是將這些細節分解到另一個文件中,然后includeinclude在兩個位置。 (Mohammad AbuShady在他的例子中這樣做了。)這樣的事情:

# Inside your main .conf
location ^~ /trends
{
    alias /var/storage/hottrend;
    include image-headers.conf;
}

location ~* ^.+\.(jpeg|gif|png|jpg)
{
    include image-headers.conf;
}

# Inside image-headers.conf
add_header Cache-control "public";
access_log   off;
expires      90d;

我通常不使用別名,但我認為這是使用別名的一個很好的例子,你可以將你的緩存設置放在/etc/nginx/image_caching.conf 如果trends僅用於圖像,我不會試圖使正則表達式復雜化並假設它總是有圖像

location /trends {
    alias /var/storage/trends;
    include /etc/nginx/image_caching.conf;
}

而對於你的榜樣的配置,你應該還沒有添加/trendsroot /var/storage/trends; 因為它已經在該位置使用,所以我認為它會顯示404因為它正在尋找/var/storage/trends/trends/123.jpg

Nginx按照它們在配置文件中出現的順序檢查定義為正則表達式的位置,並使用具有第一個匹配表達式的位置。

因此,您應該確保location ~\\.jpg$出現在定義為正則表達式的任何其他位置之前

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM