如何从将重定向 URL 作为 param 之一的 URL 中检索所有查询参数

How to retrieve all query params from the URL which has a redirect URL as one of param

提问人:Satheesh 提问时间:10/26/2023 最后编辑:Jason AllerSatheesh 更新时间:10/26/2023 访问量:57

问:

我有以下逻辑从应用程序 URL 检索查询 PARAM。但是,当存在具有自己的查询参数的 URL 作为查询参数时,此逻辑不起作用。示例如下

例如:https://test.domain.com?param1=a&ru=**https://url2.domain.com/?url2paramA=A&url2paramB=B**

在此示例中,url2param2 是 ru(重定向 URL) 的一部分。当我尝试检索 ru 参数时,它只给出包含第一个参数的 URL 部分。第二个查询参数被视为主 URL 的一部分。

电流逻辑

const getParameterByName = (name, search) => {
  const match = RegExp('[?&]' + name + '=([^&]*)').exec(search);
  try {
    return match && decodeURIComponent(match[1].replace(/\+/g, ' '));
  } catch {
    return match && match[1];

  }
};

var result = getParameterByName('ru', 'https://test.domain.com?param1=a&ru=https://url2.domain.com/?url2paramA=A&url2paramB=B');
console.log(result)

javascript reactjs url 查询字符串

评论

1赞 traktor 10/26/2023
您是否考虑过使用新的 URL(url)) 来创建实现 URL 接口的 URL 对象,以便您可以直接获取查询参数 - 不需要 RegExp。

答:

1赞 zouabi 10/26/2023 #1

如评论中所述,您可以使用 URLURLSearchParams API:

const plainUrl = 'https://test.domain.com?param1=a&ru=https://url2.domain.com/?url2paramA=A&url2paramB=B';

const url = new URL(plainUrl);

const result = url.searchParams.get('ru');

console.log(result);

编辑:

如果要考虑作为 的一部分,则必须对第二个 URL 进行编码 URIComponentparamBru

const plainMainUrl = 'https://test.domain.com?param1=a';

const plainRedirectUrl = 'https://url2.domain.com/?url2paramA=A&url2paramB=B';

// option 1: manual

const plainUrl1 = `${plainMainUrl}&ru=${encodeURIComponent(plainRedirectUrl)}`;

const url1 = new URL(plainUrl1);

const result1 = url1.searchParams.get('ru');

// end option 1


// option 2: URLSearchParams#append

const url2 = new URL(plainMainUrl);

url2.searchParams.append('ru', plainRedirectUrl);

const result2 = url2.searchParams.get('ru');

// end option 2

console.assert(result1 === result2 && result2 === plainRedirectUrl);
console.log(result1);

2赞 Khoa 10/26/2023 #2

这是因为您的重定向 url 未编码

const getParameterByName = (name, search) => {
  const match = RegExp('[?&]' + name + '=([^&]*)').exec(search);
  try {
    return match && decodeURIComponent(match[1].replace(/\+/g, ' '));
  } catch {
    return match && match[1];
  }
};

const url = `https://test.domain.com/param1=a&ru=${encodeURIComponent('https://url2.domain.com/url2paramA=A&url2paramB=B')}`;

console.log(getParameterByName('ru', url))

评论

0赞 Satheesh 11/30/2023
我需要发送 RU 解码的 URL 值以进行一些分析以及登陆到目标应用程序。但我理解谁想要添加额外的参数,他们需要对其进行编码,这是唯一的方法
-1赞 Bhavin Gunjariya 10/26/2023 #3

您的代码运行良好,但是在此代码中,您使用正则表达式提取了 url,这就是您没有获得 after 的原因,但您需要在任何特殊字符(如给定 URL)之间传递重定向 URL。&url2paramB=B&

https://test.domain.com?param1=a&ru=**https://url2.domain.com/?url2paramA=A&url2paramB=B**

此 URL 包含一个特殊字符(两个星号()),因此您可以在这些星号()之间提取重定向 URL。***

试试这个代码:

const getParameterByName = (name, search) => {
  const match = RegExp(`${name}=\\*{2}(.*?)\\*{2}`).exec(search);
  return match ? match[1] : null;
};

var result = getParameterByName('ru', 'https://test.domain.com?param1=a&ru=**https://url2.domain.com/?url2paramA=A&url2paramB=B**');
console.log(result)

评论

0赞 Satheesh 10/26/2023
RU URL 是在重定向时添加的内容,如果未经外部团队身份验证。不能要求每个团队在一些特殊字符之间添加网址
0赞 Bergi 10/27/2023
@Satheesh 为什么需要要求团队添加特殊字符?您问题中的网址已经包含它们
0赞 Bhavin Gunjariya 10/27/2023
是的,您提供的 URL 已经包含特殊字符
0赞 Satheesh 11/30/2023
纠正了它...在尝试设置粗体的同时通过在编辑器中设置格式来添加。