代理服务器未正确处理 OPTIONS 请求

Proxy server is not handling OPTIONS request correctly

我有这个简单的 node.js 代理服务器实现:

const s = http.createServer((req, res) => {

  console.log('req method:', req.method);

  if(String(req.method || '').toUpperCase() === 'OPTIONS'){
    res.setHeader('Access-Control-Expose-Headers', '*');
    res.setHeader('Access-Control-Allow-Credentials', 'true');
    res.setHeader('Access-Control-Max-Age', '3600');
    res.setHeader('Access-Control-Allow-Origin', '*');
    res.setHeader('Access-Control-Allow-Headers', '*');
    res.setHeader('Access-Control-Allow-Methods', '*');
    res.setHeader('Connection', 'keep-alive');
    res.setHeader('Access-Control-Request-Method', 'POST');
    res.setHeader('Allow', 'GET, POST, PUT, DELETE, OPTIONS, HEAD');
    res.setHeader('Allowed', 'GET, POST, PUT, DELETE, OPTIONS, HEAD');
    return res.writeHead(200);
  }

  // ...
});

问题是它没有收到除 OPTIONS 请求之外的任何请求,我怀疑这是因为它没有正确处理 OPTIONS 请求。我想允许所有内容,因为这都是 运行 在 localhost 本地 - 我对此代理服务器的 OPTIONS 请求处理有什么问题吗?

当我使用 http-proxy 库时,似乎一切正常:

const httpProxy = require('http-proxy');
const proxy = httpProxy.createProxyServer({target:'http://localhost:2020'});
const s = http.createServer((req,res) => proxy.web(req,res));

..所以我的实现有问题......我猜是最基本的问题 - 作为代理服务器,我应该将 OPTIONS 请求转发到代理服务器还是尽早响应?这绝对是第一个决定点..

我注意到的一件事是,您缺少 Content-Length header。

根据RFC7231 section 4.3.7你必须发送

Content-Length: 0

如果您没有回复 body。

关于您问题的第二部分:OPTIONS 请求应转发到目标服务器。它们不可缓存。