小编Cha*_*lky的帖子

当响应位置的域变化时使用 nginx 的 proxy_redirect

我正在使用 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 …

nginx

4
推荐指数
1
解决办法
2万
查看次数

标签 统计

nginx ×1