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

时间:2020-03-03 00:56:36

标签: node.js http http-proxy http-options-method

我有这个简单的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请求。我想允许所有操作,因为这一切都在本地主机上运行-我对此代理服务器的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));

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

1 个答案:

答案 0 :(得分:1)

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

根据RFC7231 section 4.3.7,您必须发送

Content-Length: 0

如果您没有回复正文。

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