我正在尝试在我正在开发的Ionic应用程序中包括一个新闻提要区域,并咨询其他网站的提要。但是对于某些提要URL,该应用程序抱怨缺少Access-Control-Allow-Origin参数。因此,我创建了一个lambda函数,该函数从url feed参数获取内容并将其返回给客户端,并在响应标头中添加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,但是对于特定的一个(https://www.passblue.com/feed/),我被其防火墙阻止。它向我发送以下消息:
访问被拒绝-Sucuri网站防火墙-如果您是网站所有者(或您管理此网站),请将您的IP列入白名单,或者如果您认为此阻止有误,请打开支持通知单并确保包含阻止详细信息(显示在下面的框中),因此我们可以帮助您解决问题。
我也在本地浏览器中对其进行了测试,并且可以正常工作。我还在计算机中创建了本地脚本来模仿aws lambda函数,并且该脚本也被防火墙阻止。我猜应该在请求中发送一些头信息。
有人以前见过这种行为吗?
答案 0 :(得分:0)
我可以通过使用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);
});
};