NGINX 反向代理和访问控制允许来源问题

2023-11-23

我正在配置一个NGINX Reverse Proxy.

在浏览器上我转到:
客户端网址: https://www.hollywood.com

那么上面的网页需要执行以下请求:
服务器网址: https://server.hollywood.com/api/auth/login

这是对应的配置:server.hollywood.com:

server {
    listen 443 ssl;
    server_name             server.hollywood.com;
    # add_header 'Access-Control-Allow-Origin' "https://www.hollywood.com" always;
    add_header 'Access-Control-Allow-Credentials' 'true' always;
    add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS' always;
    add_header 'Access-Control-Allow-Headers' 'Accept,Authorization,Cache-Control,Content-Type,DNT,If-Modified-Since,Keep-Alive,Origin,User-Agent,X-Requested-With' always;
    ssl_certificate         ../ssl/lets-encrypt/hollywood.com.crt;
    ssl_certificate_key     ../ssl/lets-encrypt/hollywood.com.key;
    location /
    {
        proxy_pass http://localhost:9201;
        include "../proxy_params.conf";
    }
}

实验一:

随着Access-Control-Allow-Origin当我访问时,行被注释掉:
客户端网址: https://www.hollywood.com

我在浏览器控制台上收到以下错误(在我的例子中为 Chrome):

POST https://server.hollywood.com/api/auth/login/local 502 (Bad Gateway)
(index):1 Failed to load https://server.hollywood.com/api/auth/login/local: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'https://www.hollywood.com' is therefore not allowed access. The response had HTTP status code 502.

实验2:

如果我启用Access-Control-Allow-Origin上面一行,然后我进入浏览器终端:

Failed to load https://server.hollywood.com/api/auth/login/local: Response to preflight request doesn't pass access control check: The 'Access-Control-Allow-Origin' header contains multiple values '*, https://www.hollywood.com', but only one is allowed. Origin 'https://www.hollywood.com' is therefore not allowed access.

我不知道为什么在该标头不存在之前会出现多个???

实验3:

另一方面,如果我直接在浏览器上访问:
服务器网址: https://server.hollywood.com/api/auth/loginAccess-Control-Allow-Origin行注释掉,我得到以下内容(在网络部分):

Response Headers:

Access-Control-Allow-Credentials: true
Access-Control-Allow-Headers: Accept,Authorization,Cache-Control,Content-Type,DNT,If-Modified-Since,Keep-Alive,Origin,User-Agent,X-Requested-With
Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS
Access-Control-Allow-Origin: *
Connection: keep-alive
Content-Length: 139
Content-Security-Policy: default-src 'self'
Content-Type: text/html; charset=utf-8
Date: Sat, 09 Jun 2018 06:34:00 GMT
Server: nginx/1.13.12
X-Content-Type-Options: nosniff

在我得到:“请求的资源上不存在‘Access-Control-Allow-Origin’标头。”但现在我在上面看到该字段位于响应标头中。

实验4:

如果我再次启用Access-Control-Allow-Origin上面的行,然后我得到以下内容(在网络部分):

Response Headers:

Access-Control-Allow-Credentials: true
Access-Control-Allow-Headers: Accept,Authorization,Cache-Control,Content-Type,DNT,If-Modified-Since,Keep-Alive,Origin,User-Agent,X-Requested-With
Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS
Access-Control-Allow-Origin: https://www.hollywood.com
Access-Control-Allow-Origin: *
Connection: keep-alive
Content-Length: 139
Content-Security-Policy: default-src 'self'
Content-Type: text/html; charset=utf-8
Date: Sat, 09 Jun 2018 06:34:58 GMT
Server: nginx/1.13.12
X-Content-Type-Options: nosniff

现在我得到两倍的字段:Access-Control-Allow-Origin.

您是否知道为什么我的前两个实验未能获得与以下相关的错误:Access-Control-Allow-Origin?

Thanks!


可能是您的 proxy_pass 后面的服务器正在设置Access-Control-Allow-Origin标题也是如此。

对于未来遇到类似问题的读者来说,这是值得的,我发现我的 Node.js 服务器正在传递一个Access-Control-Allow-Origin: '*'由于某种原因,我设置了 header,以及我在 node.js 中设置的实际 header 以限制 CORS。当注释掉我的node.js cors中间件时,Access-Control-Allow-Origin: '*'标题仍然保留。

为了解决这个问题,我使用了 nginxproxy_hide_header指令删除来自 node.js 的标头并按应有的方式手动添加它:

# proxying the
map $http_upgrade $connection_upgrade {
    default upgrade;
    '' close;
}

# local node.js server
upstream websocket {
    server 127.0.0.1:3000;
}

server {
    server_name ...;
    # ...;

    # add the header here
    add_header Access-Control-Allow-Origin https://www.hollywood.com;

    # Websockets config
    location /socket.io/ {
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;

        # do not pass the CORS header from the response of the proxied server to the
        # client
        proxy_hide_header 'Access-Control-Allow-Origin';

        proxy_pass http://websocket;
        proxy_http_version 1.1;
    }

    location / {
        # ...
        try_files $uri /index.html;
    }
}

谷歌搜索这个问题非常困难,因为大多数人都试图通过开放访问控制来修复 CORS!这是另一个有类似问题的问题:

https://serverfault.com/questions/751678/how-can-i-replace-access-control-allow-origin-header-in-proxy-response-with-ngin

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

NGINX 反向代理和访问控制允许来源问题 的相关文章

随机推荐

  • 使用自动生成的 Classendpoint 插入方法插入实体时抛出 NullpointerException

    我对使用自动生成的端点类感到困惑 我想使用生成的端点将新对象插入数据存储区 但是 抛出异常 fooEndpoint insertFoo foo throws null pointer exception 我的实体类与此源中给定的示例类似 h
  • C# 中的 PKCS5Padding

    我需要使用 DESede pkcs5 填充来加密字符串 但是 C 仅提供 PKCS7 填充 那么我怎样才能实现这一目标呢 我对此事没有权威 但快速谷歌发现了这一点 http social msdn microsoft com Forums
  • 初始化和销毁​​Python多处理工作者

    我有一个模型 我从 Python 中调用了很多次 该模型的启动和关闭时间较长 但处理输入数据的时间很短 可以在启动 关闭之间多次完成 多处理 Pool 似乎是完成此任务的好方法 但我无法正确销毁 Model 类 下面给出了程序代码的简化结构
  • 为我的应用程序的文档类型注册图标

    我正在尝试为我的应用程序的文档类型注册一个图标 看完之后声明新的统一类型标识符并看着 Developer Examples Sketch我在我的作品中想出了这样的东西Info plist
  • 为什么要检查这个!= null?

    有时 我喜欢花一些时间查看 NET 代码 只是为了了解幕后是如何实现的 我在查看时偶然发现了这颗宝石String Equals通过反射器的方法 C ReliabilityContract Consistency WillNotCorrupt
  • 如何在 PostgreSQL 中按类别选择具有最大日期组的 id?

    例如 我想按类别选择最大日期组的 id 结果是 7 2 6 id category date 1 a 2013 01 01 2 b 2013 01 03 3 c 2013 01 02 4 a 2013 01 02 5 b 2013 01 0
  • PyGTK:如何使图像自动缩放以适合其父窗口小部件?

    我有一个 PyGTK 应用程序需要加载未知大小的图像 但是我遇到的问题是 如果图像非常大或非常小 窗口布局会变得扭曲并且难以使用 我需要某种方法使图像自动缩放以适合其父窗口小部件 不幸的是 经过一些研究后 似乎没有内置或其他代码可以满足我的
  • 获取当前光标位置

    我想获取窗口当前的鼠标位置 并将其分配给2个变量x and y 相对于窗口的坐标 而不是相对于整个屏幕的坐标 我正在使用 Win32 和 C 还有一个简单的额外问题 您将如何隐藏 取消隐藏光标 您可以通过调用获取光标位置GetCursorP
  • iOS 截取多个屏幕截图

    我有一个NSURL包含一个视频 我想每秒录制该视频的一帧十次 我有可以捕获播放器图像的代码 但我无法将其设置为每秒捕获 10 帧 我正在尝试类似的操作 但它返回视频的相同初始帧 正确的次数 这是我所拥有的 AVAsset asset AVA
  • 在redshift中使用sql函数generate_series()

    我想在redshift中使用生成系列功能 但没有成功 redshift 文档说不支持 下面的代码确实有效 select from generate series 1 10 1 outputs 1 2 3 10 我想对日期做同样的事情 我尝试
  • 如何在Google Map sdk iOS中绘制从一个地方到另一个地方的路径?

    我需要在谷歌地图中找到从一个地方到另一个地方的路径 如何使用 google 地图 sdk iOS 绘制方向图 任何人都可以给出源代码 然后解释如何实现这一目标 Below i attached image also i need to ac
  • scala 中的泛型不变协变逆变

    这可能是一个非常愚蠢的问题 但即使在挠了很长时间之后我也无法理解其中的区别 我正在浏览 scala 泛型页面 https docs scala lang org tour generic classes html 这里据说 注意 泛型类型的
  • 如何使用类型特征进行条件编译?

    我正在尝试编写类似的代码here但使用 C 11 功能 不使用 Boost 工作自这个例子 我试图定义一个response trait 以及基于特征结果的条件编译 我怎样才能做到这一点 include
  • 从 XML 文档中获取指定的 Node 值

    我在浏览 XML 文档 使用 C 并获取所有必要的值时遇到问题 我成功地遍历了 XML 文档中所有指定的 XmlNodeList 成功获取了其中的所有 XmlNode 值 但我必须获取此 XmlNodeList 之外的一些值 例如
  • Webpack 和 angularJs

    我正在尝试使用 angularjs 和 webpack 运行简单的应用程序 这是我的代码 索引 html Full Name firstName lastName app js var app angular module myApp
  • 如何在 OAML 中读取位图?

    我想使用 OCAML 读取位图文件 从文件系统 并将像素 颜色 存储在具有位图维度的数组中 每个像素将占用数组中的一个单元格 我找到了这个功能Graphics dump image 图像 gt 颜色数组 数组但它不从文件中读取 影像影像应该
  • Python 正则表达式 \w 与组合变音符号不匹配?

    我有一个带有组合变音符号的 UTF8 字符串 我想将它与 w正则表达式序列 它匹配带有重音符号的字符 但如果存在带有组合变音符号的拉丁字符则不匹配 gt gt gt re match a w w wz u aoooz re UNICODE
  • jsonschema2pojo 不从 json 字符串生成 pojo 类

    我正在关注链接从 JSON 生成 Java 类 从 json 字符串 而不是从模式 创建 POJO 类 我正在使用 0 4 10 版本的 jsonschema2pojo jar 但无法生成 POJO 类 我的代码如下 public clas
  • 通过 RESTeasy 上的名称绑定将过滤器与特定方法匹配

    我正在尝试指定一个仅与我的某些 API 调用关联的预匹配过滤器 方法如下 RESTeasy 文档建议 我的代码如下所示 姓名绑定 NameBinding public interface ValidateFoo 资源 Path foo ba
  • NGINX 反向代理和访问控制允许来源问题

    我正在配置一个NGINX Reverse Proxy 在浏览器上我转到 客户端网址 https www hollywood com 那么上面的网页需要执行以下请求 服务器网址 https server hollywood com api a