phparrayshttp-redirectsubdomainaffiliate

Remove subdomain from URL/host to match domains in affiliate link array


I want to make a redirect file using php which can add Affiliates tag automatically to all links. Like how it works https://freekaamaal.com/links?url=https://www.amazon.in/ .

If I open the above link it automatically add affiliate tag to the link and the final link which is open is this ‘https://www.amazon.in/?tag=freekaamaal-21‘ And same for Flipkart and many other sites also. It automatically add affiliate tags to various links. For example amazon, Flipkart, ajio,etc.

I’ll be very thankful if anyone can help me regarding this.

Thanks in advance 🙏

Right now i made this below code but problem is that sometimes link have extra subdomain for example https://dl.flipkart.com/ or https://m.shopclues.com/ , etc for these type links it does not redirect from the array instead of this it redirect to default link.

<?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
?>

Solution

  • Thank you for updating your answer with the code you have and explaining what the actual problem is. Since your reference array for the affiliate links is indexed by base domain, we will need to normalize the hostname to remove any possible subdomains. Right now you have:

    $host = str_ireplace('www.', '', $host);
    

    Which will do the job only if the subdomain is www., obviously. Now, one might be tempted to simply explode by . and take the last two components. However that'd fail with your .co.id and other second-level domains. We're better off using a regular expression.

    One could craft a universal regular expression that handles all possible second-level domains (co., net., org.; edu.,...) but that'd become a long list. For your use case, since your list currently only has the .com, .in and .co.in domain extensions, and is unlikely to have many more, we'll just hard-code these into the regex to keep things fast and simple:

    $host = preg_replace('#^.*?([^.]+\.)(com|id|co\.id)$#i',  '\1\2', $host);
    

    To explain the regex we're using:

    Then we replace the hostname with the contents of the capture groups that matched domain. and its extension. This will return example.com for www.example.com, foo.bar.example.com -- or example.com; and example.co.id for www.example.co.id, foo.bar.example.co.id -- or example.co.id. This should help your script work as intended. If there are further problems, please update the OP and we'll see what solutions are available.