加入收藏 | 设为首页 | 会员中心 | 我要投稿 商洛站长网 (https://www.0914zz.com/)- AI应用、CDN、边缘计算、云计算、物联网!
当前位置: 首页 > 运营中心 > Nginx > 正文

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

发布时间:2020-11-17 02:30:31 所属栏目:Nginx 来源:互联网
导读:我正在使用SoundCloud的API制作一个Web应用程序.请求MP3流传输涉及两个请求.我举个例子.首先:http://api.soundcloud.com/tracks/59815100/stream 这将返回302,其中包含指向实际MP3的临时链接(每次都会有所不同),例如:http://ec-media.soundcloud.com/xYZk0l

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

浏览器会自动跟随重定向,因此我无法对客户端的初始响应执行任何操作.

我是nginx的新手并且有点头脑,如果我错过了一些明显的东西,或者超出了nginx的范围,那么道歉.非常感谢阅读.

您可以在proxy_redirect中使用正则表达式.见the docs.

就像是:

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总是一个好主意.

(编辑:商洛站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读