代理服务器未正确处理 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 请求应转发到目标服务器。它们不可缓存。
我有这个简单的 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 请求应转发到目标服务器。它们不可缓存。