php - 从 URL/主机中删除子域以匹配附属链接数组中的域
问题描述
我想使用 php 制作一个重定向文件,它可以自动将 Affiliates 标签添加到所有链接。就像它的工作原理一样https://freekaamaal.com/links?url=https://www.amazon.in/。
如果我打开上面的链接,它会自动将附属标签添加到链接中,打开的最终链接是“https://www.amazon.in/?tag=freekaamaal-21”,对于 Flipkart 和许多其他网站也是如此. 它会自动将附属标签添加到各种链接。例如亚马逊、Flipkart、ajio 等。
如果有人能帮助我解决这个问题,我将不胜感激。
提前致谢
现在我在下面的代码中做了这个,但问题是有时链接有额外的子域,例如https://dl.flipkart.com/或https://m.shopclues.com/等对于这些类型的链接它不会重定向数组而不是它重定向到默认链接。
<?php
$subid = isset($_GET['subid']) ? $_GET['subid'] : 'telegram'; //subid for external tracking
$affid = $_GET['url']; //main link
$parse = parse_url($affid);
$host = $parse['host'];
$host = str_ireplace('www.', '', $host);
//flipkart affiliate link generates here
$url_parts = parse_url($affid);
$url_parts['host'] = 'dl.flipkart.com';
$url_parts['path'] .= "/";
if(strpos($url_parts['path'],"/dl/") !== 0) $url_parts['path'] = '/dl'.rtrim($url_parts['path'],"/");
$url = $url_parts['scheme'] . "://" . $url_parts['host'] . $url_parts['path'] . (empty($url_parts['query']) ? '' : '?' . $url_parts['query']);
$afftag = "harshk&affExtParam1=$subid"; //our affiliate ID
if (strpos($url, '?') !== false) {
if (substr($url, -1) == "&") {
$url = $url.'affid='.$afftag;
} else {
$url = $url.'&affid='.$afftag;
}
} else { // start a new query string
$url = $url.'?affid='.$afftag;
}
$flipkartlink = $url;
//amazon link generates here
$amazon = $affid;
$amzntag = "subhdeals-21"; //our affiliate ID
if (strpos($amazon, '?') !== false) {
if (substr($amazon, -1) == "&") {
$amazon = $amazon.'tag='.$amzntag;
} else {
$amazon = $amazon.'&tag='.$amzntag;
}
} else { // start a new query string
$amazon = $amazon.'?tag='.$amzntag;
}
}
$amazonlink = $amazon;
$cueurl = "https://linksredirect.com/?subid=$subid&source=linkkit&url="; //cuelinks deeplink for redirection
$ulpsub = '&subid=' .$subid; //subid
$encoded = urlencode($affid); //url encode
$home = $cueurl . $encoded; // default link for redirection.
$partner = array( //Insert links here
"amazon.in" => "$amazonlink",
"flipkart.com" => "$flipkartlink",
"shopclues.com" => $cueurl . $encoded,
"aliexpress.com" => $cueurl . $encoded,
"ajio.com" => "https://ad.admitad.com/g/?ulp=$encoded$ulpsub",
"croma.com" => "https://ad.admitad.com/g/?ulp=$encoded$ulpsub",
"myntra.com" => "https://ad.admitad.com/g/?ulp=$encoded$ulpsub",
);
$store = array_key_exists($host, $partner) === false ? $home : $partner[$host]; //Checks if the host exists if not then redirect to your default link
header("Location: $store"); //Do not changing
exit(); //Do not changing
?>
解决方案
感谢您使用您拥有的代码更新您的答案并解释实际问题是什么。由于您的附属链接的参考数组是按基域索引的,因此我们需要规范化主机名以删除任何可能的子域。现在你有:
$host = str_ireplace('www.', '', $host);
显然,只有当子域是www.
时,它才能完成这项工作。现在,人们可能会想简单地explode
使用.
最后两个组件。但是,您.co.id
和其他二级域会失败。我们最好使用正则表达式。
可以制作一个通用的正则表达式来处理所有可能的二级域(co. , net. , org. ; edu. ,...),但这会变成一个很长的列表。对于您的用例,由于您的列表目前只有.com
,.in
和.co.in
域扩展名,并且不太可能有更多,我们只需将它们硬编码到正则表达式中以保持快速和简单:
$host = preg_replace('#^.*?([^.]+\.)(com|id|co\.id)$#i', '\1\2', $host);
为了解释我们正在使用的正则表达式:
^
主题锚点;.*?
任何字符的非贪婪可选匹配(如果存在子域 - 或子子域);([^.]+\.)
非字符的捕获组,.
后跟.
(主域名)(com|id|co\.id)
域扩展的捕获组(根据需要添加到列表中)$
主题结束锚
然后我们用匹配域的捕获组的内容替换主机名。及其扩展。这将返回example.com
, www.example.com
--foo.bar.example.com
或example.com
; example.co.id
对于, www.example.co.id
--foo.bar.example.co.id
或example.co.id
. 这应该有助于您的脚本按预期工作。如果还有其他问题,请更新 OP,我们将查看可用的解决方案。
推荐阅读
- javascript - 我可以将桌面浏览器中的缩放功能限制在一个范围内吗?
- python - Discord没有在循环中正确发送所有内容
- r - 填充 R 数据框中的多列
- c# - Unity - 动画师不会让我和禁用对撞机的代码。为什么?
- c++ - 在哪个版本的 c++ 中引入了逗号分隔的多行 if 语句,使用它有什么缺点吗?
- javascript - 为什么 react js 找不到我导出的模块?
- gitbook - gitbook init 错误:TypeError [ERR_INVALID_ARG_TYPE]:“数据”参数必须是
- swift - 如何在 Firestore 中按最新的顺序排列数组
- symfony - Symfony http缓存管理动态过期时间或如何使缓存无效?
- python - Selenium 找到一个元素并检查它是否可交互