Haproxy - 将请求转发到 S3 托管站点
Haproxy - forward request to S3 hosted site
我对haproxy知之甚少。正在测试
的配置
S3 托管网站(route 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 ^([^\ ]*)\ (.*) \ /path/
server test www.mycomain.com:1936
但是当我尝试将它重定向到 s3 托管站点时,它不起作用。下面是不工作配置的后端
reqrep ^([^\ ]*)\ (.*) \ /path/
server test1 content.mydomain.com
谢谢!
正如您在评论中指出的那样,这有效:
reqirep ^Host: Host:\ content.mydomain.com
想法是将 Host
header 设置为 S3 期望的值。
一种更简洁的方法是:
http-request set-header Host content.mydomain.com
我说"better"是因为它使用newer/better/safer机制进行header操作,但它从根本上实现了相同的目的:将请求header更改为目标服务器 (S3) 期望。使用 http-request
方法是 safer/cleaner 因为它是 "smarter" 关于它如何操纵请求——使用 req[i]rep
比使用 [= 更容易完全破坏协议15=].
最初,您询问了存储桶中 /getfiles/test.jpg
到 /test.jpg
的映射。这种重写在 HAProxy 1.6 及更高版本中非常简单和干净:
http-request set-path %[path,regsub(^/getfiles,)]
...但是在 1.5 中您必须使用 reqirep
因为 regsub
(正则表达式替换)转换器不可用:
reqirep ^([^\ :]+)\ +/getfiles(.*) \
这与请求中的 GET
(HEAD
、POST
等)行匹配,并从路径中删除额外的 /getfiles
。在排除模式中包含 :
可防止它匹配任何其他 header。可以使用类似的模式在将请求发送到 S3 之前添加前缀(例如发布版本等)。
我也在这里发布了一个示例配置。此配置将提供:
http://<haproxy>/foo/index.html
index.html
坐在 S3 上。
https://gist.github.com/amslezak/6573767376860ed59a74878fbff6e61f
我对haproxy知之甚少。正在测试
的配置S3 托管网站(route 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 ^([^\ ]*)\ (.*) \ /path/
server test www.mycomain.com:1936
但是当我尝试将它重定向到 s3 托管站点时,它不起作用。下面是不工作配置的后端
reqrep ^([^\ ]*)\ (.*) \ /path/
server test1 content.mydomain.com
谢谢!
正如您在评论中指出的那样,这有效:
reqirep ^Host: Host:\ content.mydomain.com
想法是将 Host
header 设置为 S3 期望的值。
一种更简洁的方法是:
http-request set-header Host content.mydomain.com
我说"better"是因为它使用newer/better/safer机制进行header操作,但它从根本上实现了相同的目的:将请求header更改为目标服务器 (S3) 期望。使用 http-request
方法是 safer/cleaner 因为它是 "smarter" 关于它如何操纵请求——使用 req[i]rep
比使用 [= 更容易完全破坏协议15=].
最初,您询问了存储桶中 /getfiles/test.jpg
到 /test.jpg
的映射。这种重写在 HAProxy 1.6 及更高版本中非常简单和干净:
http-request set-path %[path,regsub(^/getfiles,)]
...但是在 1.5 中您必须使用 reqirep
因为 regsub
(正则表达式替换)转换器不可用:
reqirep ^([^\ :]+)\ +/getfiles(.*) \
这与请求中的 GET
(HEAD
、POST
等)行匹配,并从路径中删除额外的 /getfiles
。在排除模式中包含 :
可防止它匹配任何其他 header。可以使用类似的模式在将请求发送到 S3 之前添加前缀(例如发布版本等)。
我也在这里发布了一个示例配置。此配置将提供:
http://<haproxy>/foo/index.html
index.html
坐在 S3 上。
https://gist.github.com/amslezak/6573767376860ed59a74878fbff6e61f