基于anine.io 的精彩回答 https://stackoverflow.com/a/38192667/1128705我想出了以下解决方案,它允许定义允许的来源列表,并且还添加了缺失的内容Acccess-Control-Allow-Origin
所有 HTTP 请求的标头。 anine.io 的答案仅显示了 CORS 预检,但没有考虑正常请求。
In haproxy.cfg
加载cors.lua
文件(如有必要,调整路径)在全局部分
global
lua-load /usr/local/etc/haproxy/cors.lua
将 CORS 配置添加到您的前端定义中
frontend http-in
# CORS configuration
# capture origin HTTP header
capture request header origin len 128
# add Access-Control-Allow-Origin HTTP header to response if origin matches the list of allowed URLs
http-response add-header Access-Control-Allow-Origin %[capture.req.hdr(0)] if !METH_OPTIONS { capture.req.hdr(0) -m reg -f /usr/local/etc/haproxy/cors-origins.lst }
# if a preflight request is made, use CORS preflight backend
http-request use-service lua.cors-response if METH_OPTIONS { capture.req.hdr(0) -m reg -f /usr/local/etc/haproxy/cors-origins.lst }
创建一个名为cors.lua
并将其存储在您上面指定的路径下。该文件包含 CORS 预检,如果没有充分的理由,请不要限制方法或标头,因为您必须在 CORS 配置中定义的 ACL 中包含有关方法或标头的任何限制haproxy.conf
. 注意:目前浏览器不支持通配符*为了Access-Control-Allow-Methods header. https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Methods#Compatibility_notes The cors.lua
文件应包含以下内容
core.register_service("cors-response", "http", function(applet)
applet:set_status(200)
applet:add_header("Content-Length", "0")
applet:add_header("Access-Control-Allow-Origin", applet.headers["origin"][0])
applet:add_header("Access-Control-Allow-Credentials", "true")
applet:add_header("Access-Control-Allow-Headers", "*")
applet:add_header("Access-Control-Allow-Methods", "GET, HEAD, POST, PUT, DELETE, PATCH, OPTIONS")
applet:add_header("Access-Control-Max-Age", "1728000")
applet:start_response()
end)
创建一个名为cors-origins.lst
并将其存储在您上面在 CORS 配置中指定的路径下。该文件应包含正则表达式(或只是简单的字符串)。如果客户端发送 Origin 标头,则会根据这些正则表达式对其进行验证,并且仅当它们匹配时,才会进行 CORS 预检cors.lua
将被退回(对于HTTP OPTIONS
请求)或Access-Control-Allow-Origin
客户端请求的原始标头的值将添加到响应中。内容示例cors-origins.lst
可能
example.com
localhost.*
.*\.mydomain\.com:[8080|8443]
测试配置http://test-cors.org/ http://test-cors.org/。对于 GET 请求,不应进行 CORS 预检。对于 GET 以外的请求,客户端应首先执行 CORS 预检请求(例如 HTTP OPTIONS 调用),以检查是否允许预期的方法、标头和授权。
See HTTP 访问控制 (CORS) https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS有关 CORS 的更多详细信息。