nginx动态代理

341 阅读1分钟

在做视频下载的时候,当<a>href属性为不同源链接时,download属性是无效的,因此决定用nginx做代理绕过同源策略,然而接口返回的视频链接域名是有可能变化的,因此不能写死proxy_pass,需要根据匹配到的location来决定proxy_pass的值。

先上代码

location ~  ^/download_assets/(.*)$ {
    resolver 114.114.114.114; # 指定dns解析服务器
    rewrite ^/download_assets/(http|https):/+([^/]*)(.*)$ $3 break; # 改写
    proxy_pass $1://$2; # 代理地址
    proxy_set_header   X-Forwarded-Proto $scheme;
    proxy_set_header   X-Real-IP         $remote_addr;
}

思路

  1. 修改接口返回的视频链接
    • 头部拼上/download_assets/,使其走nginx服务
    • 域名也要拼上,为了在nginx中获取并赋值给proxy_pass
  2. 定义location~ 表示区分大小写正则,匹配/download_assets的请求
  3. 定义rewrite,改写路径并获取主要的路径参数
  4. 定义proxy_pass,可以使用$rewrite的正则中获取相应的字符,获取域名并赋值

注意

  • http://的正则应该是/(http|https):\/+/,而不能是/(http|https):\/\/,虽然第一种写法在js中是生效的,我也不清楚是为什么
  • proxy_pass不能直接获取整个域名赋值,必须是http://$2或者$1://$2,否则是无效的
  • 本地开发则需要配置webpackdevServer