我正在使用SoundCloud的API制作一个Web应用程序.请求MP3流传输涉及两个请求.我举个例子.首先:
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位置,而无需手动输入每个可能的变化?
或者Nginx是否可以处理重定向并返回第二步的响应?所以myserver / soundcloud / tracks / 59815100跟在幕后302并返回MP3?
您可以在proxy_redirect中使用正则表达式.见the docs.
原文链接:https://www.f2er.com/nginx/435083.html就像是:
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/;
}
阅读documentation总是一个好主意.