【问题标题】:How to ignore invalid URL parameters?如何忽略无效的 URL 参数?
【发布时间】:2021-11-04 15:22:05
【问题描述】:

在我继续之前,让我说我已经查看了许多线程,但找不到适合我的答案。

基本上,我已经构建了一个自定义链接缩短器,并且我正在使用 URLSearchParams 来提取要缩短的 URL 以及来自 URL 搜索查询的自定义 slug,如下所示:

var e = window.location.search;
const urlParams = new URLSearchParams(e);
const url = urlParams.get("url");
const slug = urlParams.get("slug");

查询格式为:?url=https://google.com&slug=customslug

处理完参数后,URL 字符串会使用trim() 处理以删除任何空格。当调用我正在使用的 API (https://short.io) 时,最终输出使用encodeURIComponent() 进行编码。

但是,我希望能够使用 & 传递 URL,例如:?url=https://google.com/&testing&slug=customslug。我理想的解决方案是简单地将不属于&slug 参数的任何& 视为&url 参数中包含的URL 的一部分。目前,如果 & 字符未附加到有效参数(urlslug),则会被忽略。

我已尝试使用encodeURIComponent() 对查询输入进行编码,但这会导致无法获取任一已定义的参数。我也尝试使用split("&slug",1) 拆分输入,但这会产生一个数组,我无法将数组传递给 Short.io API。

有什么建议吗?

【问题讨论】:

  • 我不确定我是否完全遵循 - 您需要使用 encodeURIComponent 编码 各个部分urlslug),而不是全部。 (或者使用URLSearchParams/URL 也用于创建查询字符串,它会为你处理。)
  • @CherryDT 我不知道如何在不编码整个字符串的情况下对字符串的各个部分进行编码。你有例子吗?
  • console.log(`https://your-service.com/?url=${encodeURIComponent(url)}&slug=${encodeURIComponent(slug)}`) - 或 const result = new URL('https://your-service.com'); result.searchParams.set('url', url); result.searchParams.set('slug', slug); console.log(result.toString()); - 假设变量 urlslug 具有此处的相关值 - 这就是应该如何生成到您的服务的正确链接,那么您将没有再次将urlslugsearchParams 中取出时出现问题。
  • @CherryDT 这非常适合组装 URL,但它不能解决编码问题。输出仍然缺少与符号后的url 部分。
  • No...如果URL组装正确,以后解码后就不会遗漏任何东西。我刚刚解释的方法将生成一个正确编码的 URL,如https://your-service.com/?url=https%3A%2F%2Fgoogle.com%2F%26testing&slug=customslug。而new URL('https://your-service.com/?url=https%3A%2F%2Fgoogle.com%2F%26testing&slug=customslug').searchParams.get('url') 复制https://google.com/&testing 就好了。

标签: javascript url urlencode urlsearchparams


【解决方案1】:

我通过构建 @CherryDT 关于使用 window.location.hash 获取我的 URL 字符串的评论解决了我的问题。最终,我选择放弃在地址栏中添加 slug 的想法,因为它会导致我的脚本出现更多问题。

虽然此解决方案仅适用于我的目的,但我将详细介绍该解决方案,因为它可以解决无法从地址栏中对传递的 URL 字符串进行编码的问题。有一天可能对某人有用。

var e = window.location.href.replace(window.location.hash, '');
if (e.endsWith("?") === true) {
    var url = window.location.hash.substr(1);
    if (url === "") {
        // Error code
    } else {
        console.log("A URL to be shortened was provided via hash.");
        // Pass url to rest of script
     }
 }

【讨论】:

  • ?url=https://google.com/&testing&slug=customslug 是一个糟糕的查询字符串,它甚至不应该像这样!正如我在评论中解释的那样,要缩短的 URL 在填充到 url 参数之前需要进行 URL 编码!例如,如果 URL 有哈希值会发生什么,例如https://pinboard.in/faq/#invisible_account?它不仅会破坏哈希值,还会对您隐藏 slug... 或者如果 URL 也有 slug 怎么办? - 你应该从一开始就做,而不是建立半途而废的方法来修复你产生的损坏的 URL,否则它就是一堆蠕虫......
  • 问题是这个例子中的e 不能代表我的实际脚本。 e 直接从地址栏输入,不是预定义的。所以如果我的地址栏是https://my-website.com/?url=https://google.com/&testing#testing&slug=customslug,我不知道如何将urlslug分开来编码url
  • 但是这个损坏的 URL 是如何进入地址栏的呢?我想我们在这里绕圈子。你说这是你的服务,对吧?因此,您还构建了组装此错误 URL 并最终出现在地址栏中的任何代码,对吗?我的观点是那是需要解决的问题的根源,而不是问题的另一面。如果一开始就正确编码,这个问题就不会存在了。
  • URL 进入地址栏,因为我把它放在那里。该功能的重点是我可以简单地访问https://my-website.com?url=[URL]&slug=[slug] 作为缩短 URL 的快捷方式。我的脚本的其余部分包括文本框,我可以在其中手动输入 URL 和 slug,并对其进行正确编码。这是我无法编码的地址栏的快捷方式;看来我将不得不放弃这个功能,或者从地址栏快捷方式中删除slug功能,这样我就可以简单地对url之后的所有内容进行编码。
  • 建议:将 slug 作为可选查询字符串,将 URL 作为哈希...https://example.com/#[URL]https://example.com/?slug=[slug]#[URL] - 因为您似乎无论如何都在读取信息客户端,所以可以访问哈希.那么您完全没有问题,因为您可以使用window.location.hash.substr(1) 获取原始 URL。 (您也可以考虑要求 URL 作为最后一个参数 - after slug - 并将其仅应用于查询字符串参数,但是您仍然遇到哈希问题并且您不得不尴尬拆分查询字符串 - URL 作为哈希应该可以解决所有问题)
【解决方案2】:

您应该使用 URL 编码的 & 符号 %26

var e = "?url=https://google.com/%26testing&slug=customslug";
const urlParams = new URLSearchParams(e);
const url = urlParams.get("url");
const slug = urlParams.get("slug");

console.log(url);
console.log(slug);

【讨论】:

    猜你喜欢
    • 2019-10-17
    • 1970-01-01
    • 2021-04-13
    • 2011-11-06
    • 1970-01-01
    • 1970-01-01
    • 2020-03-20
    • 2016-04-04
    • 1970-01-01
    相关资源
    最近更新 更多