我正在使用 SoundCloud 的 API 制作一个网络应用程序。请求 MP3 流式传输涉及两个请求。我举个例子。首先:
http://api.soundcloud.com/tracks/59815100/stream
Run Code Online (Sandbox Code Playgroud)
这将返回一个带有指向实际 MP3 的临时链接的 302(每次都不同),例如:
http://ec-media.soundcloud.com/xYZk0lr2TeQf.128.mp3?ff61182e3c2ecefa438cd02102d0e385713f0c1faf3b0339595667fd0907ea1074840971e6330e82d1d6e15dd660317b237a59b15dd687c7c4215ca64124f80381e8bb3cb5&AWSAccessKeyId=AKIAJ4IAZE5EOI7PA7VQ&Expires=1347621419&Signature=Usd%2BqsuO9wGyn5%2BrFjIQDSrZVRY%3D
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是我试图通过 JavaScript 的 XMLHTTPRequest 加载 MP3,出于安全原因,浏览器无法遵循 302,因为 ec-media.soundcloud.com 没有设置标头说它对浏览器是安全的通过 XMLHTTPRequest 访问。
因此,我没有使用 SoundCloud URL,而是在 nginx 中设置了两个位置,因此浏览器仅与托管我的应用程序的服务器交互,并且不会出现安全错误:
location /soundcloud/tracks/ {
# rewrite URL to match api.soundcloud.com's URL structure
rewrite \/soundcloud\/tracks\/(\d*) /tracks/$1/stream break;
proxy_set_header Host api.soundcloud.com;
proxy_pass http://api.soundcloud.com;
# the 302 will redirect to /soundcloud/media instead of the original domain
proxy_redirect http://ec-media.soundcloud.com /soundcloud/media;
}
location /soundcloud/media/ {
rewrite \/soundcloud\/media\/(.*) /$1 break;
proxy_set_header Host ec-media.soundcloud.com;
proxy_pass http://ec-media.soundcloud.com;
}
Run Code Online (Sandbox Code Playgroud)
所以 myserver/soundcloud/tracks/59815100 将 302 返回到 /myserver/soundcloud/media/xYZk0lr2TeQf.128.mp3...等,然后转发 MP3。
这有效!但是,我遇到了障碍。有时 302 位置不是 ec-media.soundcloud.com,而是 ak-media.soundcloud.com。那里可能有更多服务器,并且可能随时会出现更多服务器。有什么方法可以处理任意 302 位置而无需手动输入每个可能的变化?
或者nginx可以处理重定向并返回第二步的响应吗?那么myserver/soundcloud/tracks/59815100 跟着幕后的302返回MP3?
浏览器会自动跟随重定向,所以我不能对客户端的初始响应做任何事情。
我是 nginx 的新手,如果我错过了一些明显的东西,或者它超出了 nginx 的范围,那么我很抱歉。非常感谢阅读。
您可以在proxy_redirect
. 请参阅文档。
就像是:
proxy_redirect ~^http://[^/]+(/.+)$ /soundcloud/media$1;
Run Code Online (Sandbox Code Playgroud)
应该做的伎俩。
顺便说一句,你在这里做一些奇怪的事情:
location /soundcloud/media/ {
rewrite \/soundcloud\/media\/(.*) /$1 break;
proxy_set_header Host ec-media.soundcloud.com;
proxy_pass http://ec-media.soundcloud.com;
}
Run Code Online (Sandbox Code Playgroud)
它等于这个:
location /soundcloud/media/ {
proxy_pass http://ec-media.soundcloud.com/;
}
Run Code Online (Sandbox Code Playgroud)
阅读文档总是一个好主意。