代理以使用AWS Lambda获取URL feed

时间:2018-11-01 20:13:14

标签: node.js lambda proxy

我正在尝试在我正在开发的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函数,并且该脚本也被防火墙阻止。我猜应该在请求中发送一些头信息。

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

1 个答案:

答案 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);
    });
};