Nginx
如何在 Nginx 中代理傳遞一個 URL,其中位置匹配是一個 URL,而代理傳遞有另一個 URL
我們在 Amazon AWS 上的 S3 儲存桶中託管了一些 xml 文件。Web 伺服器由 Nginx 提供支持。對於匹配 ‘/super-shots.xml’ 的特定 URL,Nginx 必須代理通過 S3 位置,即:http ://mybucket.s3.amazonaws.com/depth0/depth1/depth2/sitemap.xml
我想要的是這個(Nginx 配置):
location ~* /super-shots.xml { proxy_pass http://mybucket.s3.amazonaws.com/depth0/depth1/depth2/sitemap.xml; }
結果是一個錯誤:
nginx:
$$ emerg $$“proxy_pass”不能在正則表達式給出的位置、命名位置、“if”語句或“limit_except”塊中包含URI部分
如果我不進行正則表達式匹配 (~*|~),則沒有語法錯誤,但頁面返回 404。請注意,系統路徑上不存在該文件。
我曾嘗試四處尋找解決方案,但大多數都將路徑視為匹配項。我該如何解決這個問題?
現在,我已經完成了一個基於路徑的代理傳遞,它可以工作(如下所示)。但是,我希望它與 URL 匹配。
#Nginx Config: location /super-shots { proxy_pass http://mybucket.s3.amazonaws.com/depth0/depth1/depth2/sitemap.xml; } # On file system : Empty directory mkdir $docroot/depth0/depth1/depth2/ nginx -s reload
更新 1:基於 Alexey Ten 的評論。Nginx 配置範例可以在這裡找到
你試過簡單嗎?
location = /super-shots.xml { proxy_pass http://mybucket.s3.amazonaws.com/depth0/depth1/depth2/sitemap.xml; }
您不需要本地文件系統上的任何內容。
您的問題是請求
/super-shot.xml
匹配location ~* \.(js|ico|...xml...
。使用=
後綴我們告訴 nginx 這個確切的請求應該在這里處理,它不能尋找其他可能的匹配位置。