Nginx

如何在 Nginx 中代理傳遞一個 URL,其中位置匹配是一個 URL,而代理傳遞有另一個 URL

  • July 3, 2021

我們在 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 這個確切的請求應該在這里處理,它不能尋找其他可能的匹配位置。

引用自:https://serverfault.com/questions/754923