我来这里询问是因为我已经解决这个问题好几天了但没有成功。我试图完成的是使用 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 询问。 :)