使用AWS Lambda获取url提要的代理



我正试图在我正在开发的Ionic应用程序中包含一个新闻提要区域,以咨询其他网站的提要。但对于一些提要URL,该应用程序抱怨缺少Access Control Allow Origin参数。因此,我创建了一个lambda函数,它从url提要参数中获取内容并将其返回给客户端,在响应标头中添加Access Control Allow Origin。你可以看到下面的代码:

const https = require('https');
exports.handler = (event, context, callback) => {
var url = event.queryStringParameters.url;
https.get(url, (res) => {
console.log('statusCode:', res.statusCode);
console.log('headers:', res.headers);
res.setEncoding('utf8');
let rawData = '';
res.on('data', (chunk) => { 
rawData += chunk; 
});
res.on('end', () => {
try {
const response = {
statusCode: 200,
headers: {
'Content-Type': 'text/xml, application/xml',
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Headers': '*'
},
body: rawData,
};
// callback is sending HTML back
callback(null, response);
} catch (e) {
console.error(e.message);
callback(e);
}
});
}).on('error', (e) => {
console.error(e);
callback(e);
});
};

这适用于大多数url,但对于一个特定的url(https://www.passblue.com/feed/)我被他们的防火墙阻止了。它向我发回以下信息:

访问被拒绝-Sucuri网站防火墙-如果您是网站所有者(或您管理此网站(,请将您的IP列入白名单,或者如果您认为此阻止是一个错误,请打开支持票证并确保包括阻止详细信息(显示在下面的框中(,这样我们可以帮助您解决问题

我也从我的本地浏览器测试了它,它工作正常。我还在计算机中创建了一个本地脚本来模拟aws lambda函数,它也会被防火墙阻止。我猜我应该在请求中发送一些标头信息。

以前有人见过这种行为吗?

我用node fetch npm包替换了https节点模块,从而解决了这个问题。我猜测,一种较新的方法是在请求中设置更好的头(类似于DDOS攻击(。

const fetch = require('node-fetch');
exports.handler = (event, context, callback) => {
var url = event.queryStringParameters.url;
fetch(url).then((res) => {
return res.text();
}).then((body) => {
const response = {
statusCode: 200,
headers: {
'Content-Type': 'text/xml, application/xml',
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Headers': '*'
},
body,
};
callback(null, response);
}).catch('error', (e) => {
console.error(e);
callback(e);
});
};

最新更新