首页 > 解决方案 > 在 NodeJS 中检查外部 URL 的协议

问题描述

有没有办法使用 NodeJS 检查外部站点的协议是什么。

例如,为了缩短 URL 的目的,人们可以提供一个 url,如果他们省略了 http 或 https,我会检查它应该是哪个并添加它。

我知道我可以在没有协议的情况下重定向用户,但我只是好奇是否有办法检查它。

标签: node.jsredirect

解决方案


当然可以。首先安装request-promise及其依赖项request

npm install request request-promise

现在我们可以编写一个异步函数来获取可能缺少其协议的 URL,并在必要时添加它:

const rq = require('request-promise');

async function completeProtocol(url) {
  if (url.match(/^https?:/)) {
    // fine the way it is
    return url;
  }
  // https is preferred
  try {
    await rq(`https://${url}`, { method: 'HEAD' });
    // We got it, that's all we need to know
    return `https://${url}`;
  } catch (e) {
    return `http://${url}`;
  }
}

请记住,发出这样的请求可能会占用您服务器上的资源,尤其是当有人发送大量此类请求时。您可以通过timeout: 2000在调用时作为选项传递来缓解这种情况rq

还可以考虑只请求站点的主页,解析 URL 的其余部分,以降低以某种方式被滥用的风险。整个站点的协议应该相同。


推荐阅读