http - 如何在不将请求传递给 Web 服务器的情况下使用 HAProxy 发送响应

标签 http cors haproxy

由于CORS(跨源资源共享),服务器正在接收数以千计的OPTIONS 请求。现在,每个选项请求都被发送到其中一个服务器,这有点浪费,因为 HAProxy 可以在没有网络服务器帮助的情况下自行添加 CORS header 。

frontend https-in
    ...
    use_backend cors_headers if METH_OPTIONS
    ...

backend cors_headers
    rspadd Access-Control-Allow-Origin:\ https://www.example.com
    rspadd Access-Control-Max-Age:\ 31536000

然而,要使其正常工作,我需要在 cors_headers 后端指定至少一台实时服务器,该服务器仍将接收请求。

如何在不指定任何服务器的情况下在后端处理请求?如何停止向服务器传播请求,同时向浏览器发送响应并保持连接?

最佳答案

针对 HAProxy 2.2 及更高版本进行编辑:如果您需要支持来源白名单,Lua 脚本现在可以生成整个响应,而无需将请求传递到后端服务器。可在此处找到具有简单集成说明的示例 Lua 脚本:https://github.com/haproxytech/haproxy-lua-cors

唯一的方法是在 HAProxy 1.5.14 中手动触发 503 错误(没有可用于处理请求的服务器)并将错误页面设置为具有自定义 CORS header 的文件。

backend cors_headers
    errorfile 503 /path/to/custom/file.http

file.http 应该包含所需的标题和末尾的 2 个空行

HTTP/1.1 200 OK
Access-Control-Allow-Origin: https://www.example.com
Access-Control-Max-Age: 31536000
Content-Length: 0
Cache-Control: private


<REMOVE THIS LINE COMPLETELY>

这个“方法”有几个限制:

  • 在发送 CORS header 之前无法检查来源,因此您要么必须拥有允许来源的静态列表,要么必须允许所有来源

  • 缺少动态 header :你做不到

    http-response set-header Date %[date(),http_date]

或设置Expires header 。

注意:如果您随时间动态更新 HTTP 文件,要将更改应用到 HAProxy,您必须重新启动它。它可以是正常重启或硬重启,无论哪种情况,都会立即加载、缓存和提供新文件。

关于http - 如何在不将请求传递给 Web 服务器的情况下使用 HAProxy 发送响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26556838/

相关文章:

javascript - 对 Play REST 服务器的 Angular 2 http 请求

javascript - AWS API Gateway + AWS Lambda 中的 CORS

javascript - CORS 'Allow-Credentials' Node/ express

logging - 处理重写规则后的 Haproxy 日志记录最终路径

linux - Haproxy 中大量的 TIME_WAIT

ssl - 带 SSL 的 Haproxy 不起作用

iphone - RestKit:请求失败时获取HTTP状态码

来自套接字的 Java HTTP 请求/响应,服务器在客户端可以接收之前关闭输出流

ios - 提取被重定向到自定义 url 方案并失败

java - 如何处理从 servlet 中的 Angular 应用程序发送的预检请求?