HAProxy CORS OPTIONS 标头拦截设置

2024-03-10

通过我的 NGinx 设置,我能够拦截来自 ajax 预检的 OPTIONS 请求,并使用正确的 CORS 标头和 200 响应进行响应,以便请求可以继续前进。我正在尝试将我的前端代理整合到 HAProxy 中,但在解决这一难题时遇到了一些问题。

我的特殊问题是,虽然当服务器能够正确响应 OPTIONS 请求时我能够添加正确的 CORS 选项,但在发出预检请求时,一些后端无法处理/响应 405 错误。我的 haproxy.cfg 包含以下用于添加标头的行:

capture request header origin len 128
http-response add-header Access-Control-Allow-Origin %[capture.req.hdr(0)] if { capture.req.hdr(0) -m found }
rspadd Access-Control-Allow-Credentials:\ true if { capture.req.hdr(0) -m found }
rspadd Access-Control-Allow-Headers:\ Origin,\ X-Requested-With,\ Content-Type,\ Origin,\ User-Agent,\ If-Modified-Since,\ Cache-Control,\ Accept if { capture.req.hdr(0) -m found }
rspadd Access-Control-Allow-Methods:\ GET,\ POST,\ PUT,\ DELETE,\ OPTIONS if { capture.req.hdr(0) -m found }
rspadd Access-Control-Max-Age:\ 1728000 if { capture.req.hdr(0) -m found }

给出的解决方案:

如何使用 HAProxy 发送响应而不将请求传递到 Web 服务器 https://stackoverflow.com/questions/26556838/how-to-send-a-response-with-haproxy-without-passing-the-request-to-web-servers当您根据客户端请求设置所有正确的标头时,该方法有效,但不是动态的,这不是理想的解决方案。

任何帮助,将不胜感激!


基于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 的更多详细信息。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

HAProxy CORS OPTIONS 标头拦截设置 的相关文章

  • AJAX 表单正在向自身提交?

    我不知道今晚发生了什么 但我似乎无法让 AJAX 工作 提交表单后 它会使用 URL 中的值刷新页面 我正在使用具有提交处理程序的验证插件 但它仍然会刷新 我以前用过这个方法 没有出现任何问题 看看这里的页面 让我知道您的想法 div cl
  • 从单个 javascript 函数向两个不同的 PHP 脚本发送两个 Ajax 请求

    是否可以同时向两个或多个 Php 脚本发送 Ajax 请求 我知道这可以串行实现 从 1 获取响应 然后从另一个获取响应 但我想知道是否可以同时实现 请协助我使用以下代码 function calShowUpload if http rea
  • 如何将 STRUCT - OR - JSON 传递给 Coldfusion CFC 方法

    我有一个现有的 CFC 在将结构传递到方法中时可以正常工作 问题是 我们现在还需要通过 JSON 将数据传递到同一函数中 这是 CFC 片段
  • 从 API 网关自定义授权方返回的 401 缺少“Access-Control-Allow-Origin”标头

    为了防止未登录的用户通过 AWS API Gateway 调用我的 lambda 函数 我使用自定义授权者 lambda 解决方案 如果请求被授权 200 并且我从被调用的 lambda 得到响应 一切正常并且我得到Access Contr
  • 以一定时间间隔连续重复运行 JavaScript 函数

    这是我的第一个问题 希望您尽快回答 我想要代码连续重复一个函数 我尝试了一些代码 但没有成功 我尝试了这段代码 我想在一段时间后重复这个功能 我努力了setInterval and setTimeout 但是 我还没有收到结果 这将重复该任
  • 如何使用 javascript/jquery/AJAX 调用 Django REST API?

    我想使用 Javascript jQuery AJAX 在前端调用 Django Rest API 请求方法是 POST 但当我看到 API 调用它的调用 OPTIONS 方法时 所以 我开始了解access control allow o
  • CckEditor - 从 AJAX 加载的模板

    我正在使用 CkEditor 并且想要定义一个自定义模板 该模板使用 AJAX 函数来加载 HTML 字符串 我已经能够定义自定义模板 但如果我对模板对象的 html 属性使用函数 则该函数永远不会执行 是否可以使用 AJAX 和默认模板插
  • 如何根据服务器响应而不是HTTP 500触发 jquery.ajax() 错误回调?

    通过使用 jquery ajax 函数 我可以执行以下操作 ajax url url type GET async true dataType json data data success function data Handle serv
  • 谷歌地图 v3 API 鼠标悬停在多边形上?

    我正在使用 google v3 api 构建地图 因为它更快 本质上 它是一张包含约 30 个城市的区域地图 这些区域上有多边形 当用户将鼠标悬停在城市上时 我希望 fillColor 变亮 然后在鼠标移开时返回到正常状态 当用户单击时 它
  • wordpress - 像 stackoverflow 中那样内嵌 ajax 注释

    我有一个 WordPress 博客 希望为人们提供与 stackoverflow 中添加评论相同的用户体验 有很多评论 ajax 插件 但我找不到一个可以使用的插件 它允许您在主页上内联 进入并添加评论 而无需先深入到单独的单个帖子页面 任
  • .live() 或 .livequery()

    我有一个Ajaxed的网站 Ajax的内容来自其他页面 例如about html contact html ajax 从名为 main content 的 div 获取内容 但是在 ajax 调用之后 我的其余脚本就中断了 比如tinysc
  • 将 JSON 发布到 Python CGI

    我已经安装了 Apache2 并且 Python 可以工作 但我有一个问题 我有两页 一个是 Python 页面 另一个是带有 JQuery 的 Html 页面 有人可以告诉我如何让我的 ajax 帖子正常工作吗
  • 是否可以将请求标头添加到 CORS 预检请求中?

    我有一个从外部服务器 不是服务器 访问 API 的网站 为网站提供服务 通过简单的XmlHttpRequest 见下文 那个API 需要将用于访问服务的 API 密钥添加为请求标头 然而 正如这些CORS https developer m
  • 用javascript调用外部网页(跨域)

    我正在尝试使用以下网络服务来验证提要这个问题 https stackoverflow com questions 11996430 check if a url is a valid feed 但浏览器不允许我向另一台服务器发送 ajax
  • Javascript Ajax 优雅降级,不同页面?

    我开始更加关注如何让我的 javascript 和 ajax 优雅地降级 比较推荐哪个 致力于将优雅降级合并到现有代码中 可能很棘手 或者 为非 js 用户开发一组不同的页面 我倾向于不同的页面集 因为我觉得它更容易 并且我可以为每种用户类
  • 如何处理 ASP.net MVC Ajax 加载页面上的 jQuery 事件?

    我有一个问题 我是 jQuery Mobile 领域的新手 对于 ASP Net MVC 部分我有点迷失 这是我的问题 在我的移动网站中 我想更改导航栏 我使用的更像是应用程序栏 按钮 而我位于编辑页面或主页等 因此 这些页面 编辑 显示
  • Google reCAPTCHA 响应中没有 Access-Control-Allow-Origin 的 405 错误

    我正在尝试通过 google 实现 reCaptcha 但是当我调用下面提到的 api 时验证失败 在 reCaptcha admin 中我提到过本地主机在域列表中 google com recaptcha api siteverify 以
  • Laravel 使用 Ajax 上传文件

    我正在使用 Laravel 框架 我有一种向数据库添加新项目的形式 在该形式中用户还可以拖放文件 然后 会显示一个进度条 直到完成为止 使用 Ajax 将文件上传到服务器 提交该表格后 我运行addItem在控制器中运行 我想要执行 检查
  • AJAX 是如何工作的?

    AJAX的本质是什么 例如 我想在我的页面上有一个链接 这样当用户单击此链接时 一些信息就会发送到我的服务器 而无需重新加载当前页面 那是阿贾克斯吗 我能够通过使用 isoframe 来实现这种行为 更详细地说 我在一个小 isoframe
  • 在学习 Ajax 之前我应该​​先学习 Xml 和 Javascript 吗?

    A 由于 Ajax 是基于 Javascript 和 Xml 的 我应该在学习 Ajax 之前学习 Xml 和 Javascript 吗 B 即使了解 Javascript 和 Xml 不是必须的 如果我了解 Javascript 和 Xm

随机推荐

  • MySQL 8 中索引 JSON 列

    所以我正在尝试 json 列 Mysql 8 0 17 应该可以使用多值 JSON 索引 如下所示 CREATE INDEX data nbr idx ON a1 CAST data gt nbr AS UNSIGNED ARRAY 我有像
  • 如何使用 JavaScript 函数验证字段?

    我创建了一个表单 从文档中的示例 https getbootstrap com docs 4 0 components forms在 验证 自定义样式 部分 我在 cumpolsory 输入中添加了 必需 属性 并且验证进展顺利 现在我需要
  • 如何将自定义 Lambda 层包含到管道堆栈中? (AWS-CDK)

    我有两堆 应用栈 管道栈 将自定义 lambda 层包含到管道堆栈中以便将代码位置信息中继回我的应用程序堆栈的官方方法是什么 我已经按照文档使常规 lambdas 工作 在这里找到 https docs aws amazon com cdk
  • ASP.Net MVC Angular 2 最终版

    有人尝试过 Angular 2 RC Final 和 ASP Net MVC 吗 我在使用 ASP Net MVC 配置 Angular 2 RC 6 时遇到问题 直到 beta 17 一切正常 具有以下配置的 package json 似
  • “npm start”导致错误 - ENOENT:没有这样的文件或目录... package.json [关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 我尝试使用 NPX 创建一个 React 应用程序 一切都很顺利 但是当我跑步时npm start 我收到以下错误 np
  • 如何为 3 组添加一些列值?

    我有 3 列 SAMPN PERNO 循环 以及对应于3种模式的实用程序 角豆和步行 我想添加具有相同 SAMPN PERNO 循环的行的实用程序 适用于 car car bus bus walk walk walk bus 和 Bus w
  • Sqlite 数据库未从 Android 资产文件夹复制

    我正在尝试将名为 adinpect 的数据库从资产文件夹复制到应用程序数据库文件夹 但它不起作用 代码 在主活动 onCreate 中 仅用于测试 try String destPath data data getPackageName d
  • Rails 引擎线程安全 - ActiveResource

    我的 Rails 3 1 应用程序使用一个引擎 我想知道对该引擎的访问是否是线程安全的 我的引擎中有 lib mymodule rb 它看起来像这样 module MyModule def self my method begin data
  • XSLT 递归父/子组合

    非常有趣的Python赏金问题 https stackoverflow com questions 37170543 recursively search for parent child combinations and build tr
  • 识别 Eigen 中的临时对象创建

    正如 Eigen C 库中的文档在许多地方指出的那样 为了在计算时间方面获得最大性能 我们需要尽可能避免临时对象 在我的应用程序中 我处理动态大小矩阵 我想知道在计算中临时矩阵的创建 有没有通用的方法来识别临时矩阵的创建 例如 Eigen
  • opencv imshow with waitKey 在 Mac OS X 10.10.2 上太慢(使用 c++)

    我在 Mac OS X 10 10 2 上使用 opencv c 来处理视频帧并显示它们 使用 waitKey 来显示视频的 imshow 的性能极其缓慢 我有以下代码 它可以正确显示高清 1920x1080 灰度帧 只是它的运行速度慢了大
  • 运行前强制批处理文件加载到 RAM

    我的便携式驱动器的管理分区中有一个批处理文件 驱动器根目录上有一个符号链接到该文件的快捷方式 该文件的目的是卸载驱动器并将其重新安装为指定的盘符 主要是为了方便 打开文件时 它是相对于当前字母而不是卷 ID 打开的 因此自然地 当发生卸载时
  • 如何记住使用 core.async 和非阻塞通道读取的函数?

    我想用memoize对于使用的函数core async and
  • 线程中的类型错误。函数接受 x 位置参数,但给出 y [重复]

    这个问题在这里已经有答案了 我现在正在使用Python 我有一个start function 从消息中获取字符串 我想为每条消息启动线程 目前的线程应该像这样打印出我的消息 def startSuggestworker message pr
  • 如何在没有表单的情况下循环遍历单选按钮组?

    如何在 JavaScript 或 jQuery 中循环访问没有表单的单选按钮组 像这样的事情怎么办 使用 jQuery input radio each function if this is checked You have a chec
  • Apache httpd 与 Tomcat 7:端口 80 与端口 8080

    我最近在 Amazon ec2 上安装了 Tomcat 7 我发现Tomcat默认监听8080端口 互联网上的文档主张这是因为linux更好地将较低的端口保存给超级用户 顺便说一句 ec2 上的解决方案是创建一个负载均衡器 将通信从端口 8
  • 具有多个命名出口的延迟加载模块上的 Angular2 路由

    我在 Angular2 中遇到了路由问题 我的模块是延迟加载的 但到目前为止基本的 loadChildren 方法没有问题 模块本身正在加载 在开发工具的网络选项卡中看到 我的问题 请参阅下面我的路由代码 第一个版本工作正常 当我创建到 的
  • 与自定义 HTML 元素共享样式?

    我开始使用自定义元素 但我无法弄清楚的一件事是共享样式 例如 如果我有 2 个自定义元素
  • 如何忘记 C# 中异步方法中的同步上下文

    假设我想编写一个异步方法M 我不知道将使用什么样的同步上下文 UI ASP NET 控制台应用程序等 来调用它 我想让该方法尽可能易于使用 这意味着任何人都应该能够通过访问返回的任务的 Result 成员来同步调用它 public asyn
  • HAProxy CORS OPTIONS 标头拦截设置

    通过我的 NGinx 设置 我能够拦截来自 ajax 预检的 OPTIONS 请求 并使用正确的 CORS 标头和 200 响应进行响应 以便请求可以继续前进 我正在尝试将我的前端代理整合到 HAProxy 中 但在解决这一难题时遇到了一些