2014-03-19 43 views
2

我有一個本地目錄(上傳)和S3桶設置。 當用戶上傳文件存儲在本地目錄的圖像:/uploads/member_id/image_name 30分鐘系統中的文件上傳到S3具有相同路徑後:s3.amazonaws.com/bucket/member_id/image_name;nginx重寫 - 代理如果文件不存在

我就已經安裝此重寫規則我的nginx服務器,但它不工作。 這個規則應該檢查是否該文件是本地存在,如果沒有,打開代理S3 ..

不知道如何解決它?

location /uploads/ 
{ 
    rewrite ^/uploads/(.*)/([A-Za-z0-9\._]*)$ /uploads/$1/$2?imgname=$2&member=$1; 
    try_files $uri @fallback; 
} 

location @fallback 
{ 
    resolver 8.8.8.8; 
    proxy_pass $scheme://s3.amazonaws.com/bucket/$arg_member/$arg_imgname; 
    proxy_set_header Host s3.amazonaws.com; 
} 
+0

您是否設置了根定義,以便nginx知道在本地搜索文件的位置? –

+0

是的,根被設置,如果我刪除位置/ uploads /我可以在本地看到文件。 – user1945821

+0

嘗試將error_log指令添加到備用位置,並在此處放置詳細信息。從S3代理文件最重要的事情是* proxy_pass *和* resolver *,但您可以像這樣調整它:https://coderwall.com/p/rlguog – Anatoly

回答

0

你應該調整你的location塊使用rewrite的組合和proxy_pass指令,使得每個請求動態改寫。根據您的配置,變量看起來不是按照每個請求來解析的 - 根據Nginx's documentation,只有服務器名稱,端口和URI可以由變量指定。

你需要的是一個類似於此,重寫URI和明確指定一個代理:

location @fallback 
{ 
    resolver 8.8.8.8; 
    rewrite ^.*$ /bucket/$arg_member/$arg_imgname break; 
    proxy_pass http://s3.amazonaws.com; 
    proxy_set_header Host s3.amazonaws.com; 
} 

,滿足您的切換方案(HTTP和HTTPS),最好的選擇是可能有兩個單獨的服務器塊,有兩個不同的@fallback位置 - 一個用於HTTP,另一個用於HTTPS。在此情況下,proxy_pass位置無法解析$scheme。有關支持的內容(以及爲什麼),細節有點粗略,但Nginx's documentation是我們必須繼續。

相關問題