HAproxy:OPTIONS和POST方法的不同503错误文件
HAproxy: different 503 errorfile for OPTIONS and POST methods
我们有一个Web应用程序,它使用ajax调用在不同域上运行的后端(需要->CORS)。后端由HAproxy 1.4.22和多个Wildfly(在OpenShift PaaS上运行)组成。如果没有可用的Wildfly(例如,在"维护"期间),HAproxy为每个请求或配置的错误文件提供503服务。到目前为止还不错。。。
对于Web应用程序来说,根据被拒绝的后端请求(使用503)正确可视化"维护模式"是一个问题,因为浏览器首先发送OPTIONS请求(飞行前),并且已经收到503。最终,浏览器不会将此状态代码反映到JavaScript中执行的ajax调用中(我们总是得到状态代码0作为响应,因为浏览器将其解释为飞行前的致命故障并拒绝任何访问)。这个故事并不新鲜,在stackoverflow有很多帖子。
那么如何解决这个问题呢我的想法是提供两个不同的错误文件(HAproxy语言中的"错误文件")-一个为OPTIONS请求提供内容为"HTTP/1.1 200 OK…Access Control Allow Origin:*……"的错误文件,以通过浏览器中的飞行前检查,然后一个为POST请求提供内容"HTTP/1.1503……",以使浏览器在ajax响应中真正反映状态503。然而,我无法运行。
global
maxconn 256
defaults
mode http
log global
option httplog
...
listen express 127.4.184.2:8080
acl is_options method OPTIONS
acl is_post method POST
errorfile 503 /var/lib/openshift/564468c90c1e66c7f2000077/app-root/runtime/repo/503.http if is_post
errorfile 503 /var/lib/openshift/564468c90c1e66c7f2000077/app-root/runtime/repo/options.http if is_options
option httpchk GET /
http-check expect rstatus 2..|3..|401
balance leastconn
server local-gear 127.4.184.1:8080 check fall 2 rise 3 inter 2000 cookie local-564468c90c1e66c7f2000077
我知道这不起作用,因为错误文件不允许使用if <condition>
变体。
我如何才能实现我所希望的行为如果有人有其他解决方案来解决这个"维护模式"/CORS问题,我愿意接受任何想法。。。
提前感谢!
我找到了一个很好的解决方案:
- 定义两个"后端"(因此将"侦听"部分拆分为"前端"answers"后端"
- "frontend"部分检查请求方法,并使用一个"backend"来回答OPTIONS请求,一个"后端"来回答所有其他请求
- 第一个定义的"后端"用于用200回答所有OPTIONS请求:这可以用错误文件来完成,如果我们在本节中没有列出任何服务器,则此"后端"标记为Down,并因此响应错误文件(在其中我们将200发送回OPTIONS要求)
- 第二个定义的"后端"保留"真实"后端,并在真实服务器关闭的情况下响应错误文件中的内容
- 在错误文件中,我们可以添加CORS头
HAproxy.cfg:
global
maxconn 256
defaults
mode http
log global
option httplog
option dontlognull
maxconn 128
...
frontend balancer
bind 127.8.155.130:8080
mode http
acl is_options method OPTIONS
use_backend cors_backend if is_options
default_backend business_backend
backend cors_backend
errorfile 503 options.http
backend business_backend
errorfile 503 503.http
server ...
server ...
选项。http
HTTP/1.1 200 OK
Access-Control-Allow-Headers: Origin, Accept, X-Session_id, Content-Type
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true
Access-Control-Max-Age: 86400
Access-Control-Allow-Methods: HEAD, DELETE, POST, GET, OPTIONS, PUT
Connection: close
[empty line]
503.http
HTTP/1.1 503 Service Unavailable
Cache-Control: no-cache
Access-Control-Allow-Origin: *
Connection: close
[empty line]
还有一个额外的冒险:这个配置通过HAproxy自动为所有OPTIONS请求提供服务——即使有CORS支持!
- Webpack/Rect:遵循egghead.io教程,但出现错误:您可能需要一个合适的加载程序来处理此文件类型
- CKFinder 3为所选文件返回错误的URL
- 生成pdf或其他非html文件时的错误处理
- 有什么“;错误的”;将javascript放在asp.net表单上,而不是放在单独的文件中
- 导致内容安全策略(CSP)冲突错误的本地jquery.js文件
- 从安卓设备将图像上传到服务器时,文件扩展名错误
- 在量角器中创建一个.txt错误输出文件是手动的,而不是控制台错误
- 输入类型文件的未捕获类型错误
- 使用ajax上传的文件返回错误,但使用c#在asp.net的服务器端正常提交的文件
- 如何使用JavaScript粘贴原始二进制文件而不出现“无效字符”错误
- 放大弹出生成“;找不到文件”;YouTube视频的错误
- 在页面对象文件中验证sendKeys结果会导致未定义的错误(Protractor)
- 在浏览器中打开文本文件-服务器上出现错误
- IE 9 BHO插件.加载外部JS文件时出现错误SCRIPT1014
- 使用SeleniumWebdriver将文本复制到文件时出现编译错误的解决方案
- 使用.htaccess压缩文件时出现500错误
- 文件上传长度错误 (..文件长度)
- HAproxy:OPTIONS和POST方法的不同503错误文件
- 为什么ajax调用中的错误文件路径会杀死整个javascript文件
- JW播放器载入媒体错误:文件无法播放