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

前端之家收集整理的这篇文章主要介绍了当响应位置的域发生变化时,使用nginx的proxy_redirect前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

我正在使用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总是一个好主意.

原文链接:https://www.f2er.com/nginx/435083.html

猜你在找的Nginx相关文章