如何在代理请求时在 ExpressJS 中 add/remove 响应 headers
How to add/remove response headers in ExpressJS while proxying request
我有一些文件存储在无法从客户端直接访问的 CDN 服务器上。因此,我通过 public 可访问服务器 运行 ExpressJS 代理请求,并使用 request
模块获取数据 server-side 和 return 作为响应。
它正在运行,代码看起来像这样:
var request = require('request');
var app = express();
var internalUrl = 'https://my.storage-cdn.com/private/info/file.xml';
app.get('/somefile.xml', function (req, res) {
request(internalUrl).pipe(res);
});
我用上述方法遇到的问题是:
- storage/cdn 服务器附加了它自己的一些响应 headers
其中包括一些私人信息,因此可以是一种安全
响应时暴露的问题。和上面的管道方法
res
object 到 request
不会删除那些 headers。它通过那些
headers 就像回应一样。我想删除那些 headers。
- 我想添加一些 eTag 和 cache-control headers 以便可以缓存文件
正确。
我试过把它改成这样:
app.get('/somefile.xml', function (req, res) {
request(internalUrl, function (err, response, body) {
if (!err && response.statusCode == 200) {
res.writeHead(200, {...}); // write custom headers I need
res.end(body);
}
});
});
这允许我根据自己的喜好覆盖 headers,但是在这种方法中,我必须先等待整个文件在服务器端下载完毕,然后才能开始在我的响应中发送字节并使用有些文件大到 1MB,这确实会影响响应时间。
所以我的问题是 - 有没有一种方法可以在开始发送响应之前不必等待整个文件在服务器端下载,但仍然能够操纵响应 headers?
您可以挂接到 'response' 事件:
const SECRET_HEADERS = ['Set-Cookie', 'X-Special-Token']
app.get('/somefile.xml', function (req, res) {
request(internalUrl).on('response', function (response) {
SECRET_HEADERS.forEach(function (header) {
response.removeHeader(header)
})
}).pipe(res)
})
我有一些文件存储在无法从客户端直接访问的 CDN 服务器上。因此,我通过 public 可访问服务器 运行 ExpressJS 代理请求,并使用 request
模块获取数据 server-side 和 return 作为响应。
它正在运行,代码看起来像这样:
var request = require('request');
var app = express();
var internalUrl = 'https://my.storage-cdn.com/private/info/file.xml';
app.get('/somefile.xml', function (req, res) {
request(internalUrl).pipe(res);
});
我用上述方法遇到的问题是:
- storage/cdn 服务器附加了它自己的一些响应 headers
其中包括一些私人信息,因此可以是一种安全
响应时暴露的问题。和上面的管道方法
res
object 到request
不会删除那些 headers。它通过那些 headers 就像回应一样。我想删除那些 headers。 - 我想添加一些 eTag 和 cache-control headers 以便可以缓存文件 正确。
我试过把它改成这样:
app.get('/somefile.xml', function (req, res) {
request(internalUrl, function (err, response, body) {
if (!err && response.statusCode == 200) {
res.writeHead(200, {...}); // write custom headers I need
res.end(body);
}
});
});
这允许我根据自己的喜好覆盖 headers,但是在这种方法中,我必须先等待整个文件在服务器端下载完毕,然后才能开始在我的响应中发送字节并使用有些文件大到 1MB,这确实会影响响应时间。
所以我的问题是 - 有没有一种方法可以在开始发送响应之前不必等待整个文件在服务器端下载,但仍然能够操纵响应 headers?
您可以挂接到 'response' 事件:
const SECRET_HEADERS = ['Set-Cookie', 'X-Special-Token']
app.get('/somefile.xml', function (req, res) {
request(internalUrl).on('response', function (response) {
SECRET_HEADERS.forEach(function (header) {
response.removeHeader(header)
})
}).pipe(res)
})