PHP实现URL对比:判断不同URL是否指向相同页面
解决方案:区分URL变体,实现精准的页面重复检测
你需要处理两类URL的重复校验场景——一类是同一页面的带推荐人参数的URL变体,另一类是路径不同的独立页面URL,核心是提炼出每个URL对应的「页面唯一标识」,再判断这个标识是否已存在。下面是具体的实现思路和示例:
核心思路
首先得明确不同站点的URL结构规则:
- 对于
signals.network这类站点:/join/后面的字符串是推荐人追踪参数,不属于页面路径的核心部分,两个URL本质指向同一页面,需要统一为同一个标识。 - 对于
westart.co这类站点:/project/后面的项目名是页面路径的关键部分,不同项目名对应不同页面,必须保留完整路径作为标识。
基于这个规则,我们可以用「域名+核心路径」作为唯一键来做重复检测。
具体实现步骤
- 解析URL结构:用语言自带的URL解析工具拆分域名、路径等关键部分(避免手动字符串处理出错)。
- 配置站点规则:针对不同域名制定核心路径的提取规则,方便后续扩展。
- 生成唯一标识:根据规则提取核心路径,拼接域名后得到唯一键,用这个键查询是否已存在。
代码示例(JavaScript)
// 维护不同站点的路径处理规则,可按需扩展 const sitePathRules = { 'signals.network': { // 匹配带推荐人参数的join路径 matchPattern: /^\/join\/[^/]+$/, getCorePath: () => '/join/' // 提取核心页面路径 }, 'westart.co': { // 匹配带项目名的project路径 matchPattern: /^\/project\/[^/]+$/, getCorePath: (path) => path // 保留完整路径作为核心标识 } }; function generateUniquePageKey(inputUrl) { const url = new URL(inputUrl); const domain = url.hostname; const currentPath = url.pathname; // 获取当前站点规则,无规则则用默认逻辑 const rule = sitePathRules[domain]; if (!rule) { // 默认:保留完整域名+小写路径作为唯一键 return `${domain}${currentPath.toLowerCase()}`; } // 匹配规则则生成对应核心路径,否则用默认 if (rule.matchPattern.test(currentPath)) { return `${domain}${rule.getCorePath(currentPath)}`; } else { return `${domain}${currentPath.toLowerCase()}`; } } // 测试用例 console.log(generateUniquePageKey('https://signals.network/join/47AA4E')); // 输出: signals.network/join/ console.log(generateUniquePageKey('https://signals.network/join/')); // 输出: signals.network/join/ console.log(generateUniquePageKey('https://westart.co/project/nuggets-airdrop')); // 输出: westart.co/project/nuggets-airdrop console.log(generateUniquePageKey('https://westart.co/project/')); // 输出: westart.co/project/
扩展建议
- 把规则配置做成后台可编辑的形式,后续新增站点时不用修改代码。
- 如果遇到参数在查询串中的情况(比如
xxx.com/join?ref=123),可以扩展规则忽略指定的追踪查询参数。 - 统一URL的大小写(比如转成小写),避免因大小写差异误判为不同页面。
内容的提问来源于stack exchange,提问作者Morten Repsdorph Husfeldt
相关产品推荐
相关产品推荐

