我正在使用SoundCloud的API制作networking应用程序。 请求MP3stream传输涉及两个请求。 我会举一个例子。 首先:
http://api.soundcloud.com/tracks/59815100/stream
这返回一个302与临时链接到实际的MP3(每次不同),例如:
http://ec-media.soundcloud.com/xYZk0lr2TeQf.128.mp3?ff61182e3c2ecefa438cd02102d0e385713f0c1faf3b0339595667fd0907ea1074840971e6330e82d1d6e15dd660317b237a59b15dd687c7c4215ca64124f80381e8bb3cb5&AWSAccessKeyId=AKIAJ4IAZE5EOI7PA7VQ&Expires=1347621419&Signature=Usd%2BqsuO9wGyn5%2BrFjIQDSrZVRY%3D
我遇到的问题是我试图通过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; }
所以myserver / soundcloud / tracks / 59815100返回302到/myserver/soundcloud/media/xYZk0lr2TeQf.128.mp3…etc,然后转发MP3。
这工作! 但是,我已经遇到了麻烦。 有时302位置不是ec-media.soundcloud.com,它是ak-media.soundcloud.com。 有可能更多的服务器,并可能在任何时候出现更多。 有什么办法可以处理任意302位置,而不必手动input每个可能的变化?
还是有可能nginx处理redirect并返回第二步的响应? 那么myserver / soundcloud / tracks / 59815100是在302后面跟着回来的MP3?
浏览器会自动遵循redirect,所以我不能对客户端的初始响应做任何事情。
我是nginx的新手,如果我错过了一些显而易见的东西,或者超出了nginx的范围,那么我就有点儿道歉了。 非常感谢您的阅读。
您可以在proxy_redirect使用正则expression式。 看文档 。
就像是:
proxy_redirect ~^http://[^/]+(/.+)$ /soundcloud/media$1;
应该做的伎俩。
顺便说一句,你在这里做一些奇怪的事情:
location /soundcloud/media/ { rewrite \/soundcloud\/media\/(.*) /$1 break; proxy_set_header Host ec-media.soundcloud.com; proxy_pass http://ec-media.soundcloud.com; }
它等于这个:
location /soundcloud/media/ { proxy_pass http://ec-media.soundcloud.com/; }
阅读文档总是一个好主意。