我应该如何配置Nginx代理到参数传递的URL?

时间:2015-09-25 05:15:52

标签: nginx proxy oauth-2.0

我试图访问OAuth2身份验证后面的媒体文件(图片,视频)。

为了访问资源,我需要为请求添加自定义授权承载令牌,因此我不能使用简单的重写(至少据我所知)。

无法通过纯HTML(例如imgvideo标记)来完成,因此我考虑让Nginx将查询代理到最终服务器。

每个媒体资源都将通过/proxy路径加载,其中token参数(用于身份验证)和url用于加载实际资源。

示例网址:

http://myserver.com/proxy/?token=12345&url=http://protectedserver.com/custompath/asset

这是我提出的,但我不太确定如何配置proxy_pass指令,因为我需要它专门代理$url变量。我不需要代理路径(无论如何都是空的。)

location /proxy/ {
  if ($arg_token ~ "^$") { return 404; }
  if ($arg_url ~ "^$") { return 404; }
  set $url $arg_url;
  proxy_set_header Authorization "Bearer $arg_token";
  set $args "";
  #proxy_pass $url;
}

注意:这将在一个封闭的环境中运行,只有特定的机器(交互有限的信息亭)才能访问该页面,因此我不担心潜在的泄漏身份验证令牌。

我在ServerFault上发现了类似的问题,但没有人对此有任何答案: https://serverfault.com/questions/671991/nginx-proxy-pass-url-from-get-argument

我正在寻找配置设置,以使其工作或可行的替代解决方案。

1 个答案:

答案 0 :(得分:5)

这是我的问题的正确配置:

location /proxy/ {
  if ($arg_token ~ "^$") { return 404; }
  if ($arg_url ~ "^$") { return 404; }

  set $url $arg_url;
  set $token $arg_token;
  set $args "";

  # IMPORTANT, this is required when using dynamic proxy pass
  # You can alternatively use any DNS resolver under your control
  resolver 8.8.8.8;

  proxy_pass $url;
  proxy_set_header Authorization "Bearer $token";
  proxy_redirect off;
}