Haproxy-将请求转发到S3托管站点

Cha*_*yak 1 amazon-s3 haproxy

我对haproxy的了解极少。在测试配置

S3托管网站(路由53别名)
-content.mydomain.com URL登陆haproxy-www.mydomain.com/getfiles/

是否可以将重新路由www.mydomain.com/getfiles/重定向到content.mydomain.com(s3托管网站)。

我能够使用下面提到的配置将其重定向到在同一服务器上运行的另一个应用程序

  acl display-s3-content path_beg /getfiles/
  use_backend my-content if display-s3-content

backend my-content   
  reqrep ^([^\ ]*)\ (.*) \1\ /path/\2   
  server test www.mycomain.com:1936
Run Code Online (Sandbox Code Playgroud)

但是当我尝试将其重定向到s3托管站点时,它不起作用。以下是无法正常使用的配置的后端

  reqrep ^([^\ ]*)\ (.*) \1\ /path/\2
  server test1 content.mydomain.com
Run Code Online (Sandbox Code Playgroud)

谢谢!

Mic*_*bot 5

正如您在评论中指出的那样,这有效:

reqirep ^Host: Host:\ content.mydomain.com
Run Code Online (Sandbox Code Playgroud)

想法是将Host标头设置为S3期望的值。

较为简洁的方法是:

http-request set-header Host content.mydomain.com
Run Code Online (Sandbox Code Playgroud)

我之所以说“更好”,是因为它使用了一种更新/更好/更安全的标头处理机制,但是它从根本上实现了相同的目的:将请求标头更改为目标服务器(S3)期望的内容。使用此http-request方法更安全/更清洁,因为它在处理请求的方式上“更智能” req[i]rep,与使用相比,完全破坏协议使用起来要容易得多http-request

最初,您询问有关存储桶中的/getfiles/test.jpg映射/test.jpg的信息。在HAProxy 1.6和更高版本中,此重写非常容易且干净:

http-request set-path %[path,regsub(^/getfiles,)]
Run Code Online (Sandbox Code Playgroud)

...但是在1.5中,reqirep由于regsub(regex替换)转换器不可用,因此必须使用:

reqirep ^([^\ :]+)\ +/getfiles(.*) \1\ \2
Run Code Online (Sandbox Code Playgroud)

这与请求中的GETHEADPOST等)行匹配,并/getfiles从路径中删除多余的行。:在排除模式中包含会阻止其与任何其他标题匹配。在将请求发送到S3之前,可以使用类似的模式来添加前缀(例如发行版本等)。