如何规范化URL?

时间:2018-07-02 21:20:40

标签: node.js url

我正在处理一种情况,我需要用户输入各种URL(例如:用于其个人资料)。但是,用户并非总是以https://example.com格式插入URL。他们可能会插入以下内容:

  • example.com
  • example.com/
  • example.com/somepage
  • 但是me@example.com之类的东西或其他不可接受的东西

如何将URL规范化为可能导致网址的格式?我在网络浏览器中看到了这种现象。我们几乎总是在网络浏览器的栏中输入糟糕的内容,它们可以区分是搜索还是可以转换为URL的内容。

我尝试在很多地方寻找,但似乎找不到任何解决方法。

如果可能,我希望为Node编写一个解决方案。非常感谢你!

2 个答案:

答案 0 :(得分:3)

使用节点的URL API和一些手动检查。

  1. 手动检查URL是否具有有效的协议。
  2. 实例化该URL。
  3. 检查URL是否包含其他信息。

示例代码:

const { URL } = require('url')
let myTestUrl = 'https://user:pass@sub.host.com:8080/p/a/t/h?query=string#hash';

try {
  if (!myTestUrl.startsWith('https://') && !myTestUrl.startsWith('http://')) {
    // The following line is based on the assumption that the URL will resolve using https.
    // Ideally, after all checks pass, the URL should be pinged to verify the correct protocol.
    // Better yet, it should need to be provided by the user - there are nice UX techniques to address this.
    myTestUrl = `https://${myTestUrl}`
  }

  const normalizedUrl = new URL(myTestUrl);

  if (normalizedUrl.username !== '' || normalized.password !== '') {
    throw new Error('Username and password not allowed.')
  }

  // Do your thing
} catch (e) {
  console.error('Invalid url provided', e)
}

在此示例中,我仅将httphttps用于要点。

直接从文档中获得API的可视化效果

┌─────────────────────────────────────────────────────────────────────────────────────────────┐
│                                            href                                             │
├──────────┬──┬─────────────────────┬─────────────────────┬───────────────────────────┬───────┤
│ protocol │  │        auth         │        host         │           path            │ hash  │
│          │  │                     ├──────────────┬──────┼──────────┬────────────────┤       │
│          │  │                     │   hostname   │ port │ pathname │     search     │       │
│          │  │                     │              │      │          ├─┬──────────────┤       │
│          │  │                     │              │      │          │ │    query     │       │
"  https:   //    user   :   pass   @ sub.host.com : 8080   /p/a/t/h  ?  query=string   #hash "
│          │  │          │          │   hostname   │ port │          │                │       │
│          │  │          │          ├──────────────┴──────┤          │                │       │
│ protocol │  │ username │ password │        host         │          │                │       │
├──────────┴──┼──────────┴──────────┼─────────────────────┤          │                │       │
│   origin    │                     │       origin        │ pathname │     search     │ hash  │
├─────────────┴─────────────────────┴─────────────────────┴──────────┴────────────────┴───────┤
│                                            href                                             │
└─────────────────────────────────────────────────────────────────────────────────────────────┘

答案 1 :(得分:0)

您需要normalize-url软件包:

Admin

它在URL上进行了一堆规范化。