将 CORS 相关标头转发到 apache2 中的反向代理 (debian)

将 CORS 相关标头转发到 apache2 中的反向代理 (debian)

我来这里询问是因为我已经解决这个问题好几天了但没有成功。我试图完成的是使用 apache2 设置到 nodejs/Express 后端的反向代理。代理 http 和 websocket 连接工作正常,但是启用 CORS 不起作用。我需要它,因为应用程序提供了一个小部件,该小部件将由外部主机上的客户端导入。这里的主要信息是 cors 应该由expressjs 的 cors() 中间件处理,并且所有相关的标头/请求应该简单地通过 apache2 来回代理到该后端服务器。这是我当前的配置,其中包含一些关于我如何理解不同指令的评论:

<VirtualHost my.domain.name:80>
 # redirecting all requests to https (works fine)
</VirtualHost>

<VirtualHost my.domain.name>
 
 LogLevel debug # does not log any information regarding the headers

 ServerName my.domain.name
 ServerAdmin [email protected]

 ## SSL directives removed for clarity
 ## logfile directives removed for clarity

 # forward requests to proxy =>
 ProxyPreserveHost On # Not sure if this is required as I forward the Origin header

 <Location "/"> # proxy all requests
  ProxyPass "http://localhost:3333/" # location of the backend server
  ProxyPassReverse "http://localhost:3333/" # required
 </Location>

 #ProxyRequest Off # Throws an error (unknown directive), but disabled by default, so not required
 
 # forward socket.io requests removed for calrity

 ## Required headers for CORS:
 # crucial CORS-related header that indicates the origin of the requesting domain
 RequestHeader set Origin "%{ORIGIN}e"

 # used in CORS preflight requests to indicate the HTTP method
 RequestHeader set Access-Control-Request-Method "%{REQUEST_METHOD}e"

 # used in CORS preflight requests to indicate the requested headers
 RequestHeader set Access-Control-Request-Headers "%{HTTP_ACCESS_CONTROL_REQUEST_HEADERS}e"

</VirtualHost>

在本地,我使用 nginx 来测试反向代理后面的小部件,它工作正常(包括来自另一个端口的 CORS):

server {
   # omitted meta and SSL specific directives for clarity
 
   location / {
    proxy_pass      http://127.0.0.1:3333;

    # enable websocket passthrough
    proxy_http_version  1.1;
    proxy_set_header    Upgrade $http_upgrade;
    proxy_set_header    Connection "upgrade";

        proxy_set_header        Host $host;
        proxy_set_header        X-Real-IP $remote_addr;
        proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header        X-Forwarded-Proto $scheme;
   }

}

我发现 nginx 没有设置原点或与 OPTIONS 预检请求相关的任何内容。另外,据我所知,Host 和 X-Real-IP 与 cors 没有直接关系。我想知道为什么这有效。请注意,我之前在 apache2 配置中包含了 X-Forwarded-* 标头(无济于事),以确保 express 中的 cors 中间件在发现代理请求时不会抱怨缺少信息。

阅读有关 mod_proxy 和 mod_headers 的 apache2 文档以及在网上搜索有关如何执行此操作的信息,我的大脑正在融化,我真的希望能够启发我在这里遗漏/做错了什么。先感谢您 !

编辑 需要明确的是:Cors 似乎设置正确,因为当我直接请求小部件(不使用反向代理)时它可以工作。

也很抱歉将其发布在错误的 stackexchange 中(可能......)。我刚刚意识到 serverfault 可能是正确的页面。但是,我主要感兴趣的是如何调试它,例如获取有关来回传递的标头的正确调试日志。如果您无法帮助我解决问题的网络相关背景,我也可能会在 serverfault 询问。 :)

相关内容