HTML Remix - Dont copy code, remix it!

January 4, 2012

Permanent URL masking for mirroring website using php and htaccess

Posted by : Remiz
Filed under : Programming

Note: This article was published on my web development company blog and re-posted over here for enabling discussion and continuous developments


Now you want to mirror a website of someone else or your own to a new domain. You can simply set it as an addon domain if you have access to original site’s hosting control panel. But what if not? If you use htaccess redirects, it promptly redirects to original site.

Another quick way is to use iframes. Just put following code in your index.html of new domain.

 <iframe src="http://originalsite.com" height="100%" width="100"></iframe> 

But if visitor clicks a link on the page, it wont update the url on the address bar and user fill feel fishy :)

Here is the simple script which makes the masking work. It has two portions a php file and one htaccess file.

What php file does is, it opens the original website and grab the content to bump it back to the browser. In the process, it replaces any text with source site url to your new url. So that links on the site and all resource are called from your new domain itself. Smart! isn’t it?

# index.php
<?php
// enter your site names here. Just the core url no http or tail slashes 
$wc_source = "originalsite.com";
$wc_mirror = "yourawesomedomain.com";
/*
Look hard under this line. But dont try to change unless you are above 18 and know how to read awasthakiyoguyiomonstia
*/ 
$sql = $_GET['sql'];
$URL = "http://".$wc_source."/".$sql;
$fullPath = $URL;
$base = '<base href="'.$URL.'">';
$host = preg_replace('/^[^\/]+\/\//','',$URL);
$tarray = explode('/',$host);
$host = array_shift($tarray);
$URI = '/' . implode('/',$tarray);
$content = '';
$fp = @fsockopen($host,80,$errno,$errstr,30);
if(!$fp) { echo "Unable to open socked: $errstr ($errno)\n"; exit; } 
fwrite($fp,"GET $URI HTTP/1.0\r\n");
fwrite($fp,"Host: $host\r\n");
if( isset($_SERVER["HTTP_USER_AGENT"]) ) { fwrite($fp,'User-Agent: '.$_SERVER["HTTP_USER_AGENT"]."\r\n"); }
fwrite($fp,"Connection: Close\r\n");
fwrite($fp,"\r\n");
while (!feof($fp)) { $content .= fgets($fp, 128); }
fclose($fp);
if( strpos($content,"\r\n") > 0 ) { $eolchar = "\r\n"; }
else { $eolchar = "\n"; }
$eolpos = strpos($content,"$eolchar$eolchar");
$content = substr($content,($eolpos + strlen("$eolchar$eolchar")));
$content = str_replace($wc_source,$wc_mirror,$content);
// replaces paths with / in the begining without full url. not required unless you are in subfolder
$content = str_replace('href="/','href="http://'.$wc_mirror.'/',$content);
$content = str_replace('src="/','src="http://'.$wc_mirror.'/',$content);

// $fsize = filesize($fullPath); 
    $path_parts = pathinfo($fullPath); 
    $ext = strtolower($path_parts["extension"]); 
    
    // Determine Content Type 
    switch ($ext) { 
      case "pdf": $ctype="application/pdf"; break; 
      case "exe": $ctype="application/octet-stream"; break; 
      case "zip": $ctype="application/zip"; break; 
      case "doc": $ctype="application/msword"; break; 
      case "xls": $ctype="application/vnd.ms-excel"; break; 
      case "ppt": $ctype="application/vnd.ms-powerpoint"; break; 
      case "gif": $ctype="image/gif"; break; 
      case "png": $ctype="image/png"; break; 
      case "jpeg": $ctype="image/jpg"; break; 
      case "jpg": $ctype="image/jpg"; break;
      case "js": $ctype="text/javascript"; break;	 
      case "css": $ctype="text/css"; break;
    } 

    header("Pragma: public"); // required 
    header("Expires: 0"); 
    header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); 
    header("Cache-Control: private",false); // required for certain browsers 
    header("Content-Type: $ctype"); 
    header("Content-Transfer-Encoding: binary"); 
//    header("Content-Length: ".$fsize); 
	

if( preg_match('/<head\s*>/i',$content) ) { echo( preg_replace('/<head\s*>/i','<head>'.$base,$content,1) ); }
else { echo ( str_replace($wc_source,$wc_mirror,preg_replace('/<([a-z])([^>]+)>/i',"<\\1\\2>".$base,$content,1) )); 
}
?>

Now its true that you don’t have any other resource / files on the new domain server. Here comes the htaccess to play its role. htaccess sends all requests to index.php with full path so that index.php can return content for corresponding files from Original website.

#htaccess file
<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /
    #Checks to see if the user is attempting to access a valid file,
    #such as an image or css document, if this isn't true it sends the
    #request to index.php
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ /index.php?sql=$1 [L]
</IfModule>

Implementation is very straight forward. You just need to put in the source and mirror urls in the php file. Everything works out of the box.

Once the files are set with proper urls, when you go to newdomain.com , it will show you content from originalsite.com and all links will word as of newdomain.com/link.html


Incoming search terms:

url masking in php, url masking htaccess, url masking, url masking html, php url masking script

Remiz

Remixed version of unstable human emotions and thirst of mankind actions. UX designer, UI developer and HE of WebCastle Media Pvt LTD

More Posts - Twitter - Facebook


18 Responses to “Permanent URL masking for mirroring website using php and htaccess”

  1. tom says:

    Hi Remiz,

    Have uploaded your files at our site http://www.craftwholesale.in/ which is redirecting to crafts.itsybitsy.in, but on clicking any link opens only the home page

    Please advice

  2. Kranthi says:

    Hi Remiz,

    Great Job… kudos from my team….

    Thank You..

  3. D says:

    Is is it possible to tweak the code so subdomains get passed on to the mirror? Ex: foo.mirrordomain.com will load foo.sourcedomain.com (under the mask).

    • D says:

      I was actually able to modify this code to get it to work with subdomains! :) Now I have another question… instead of having it load sourcedomain.com, how can I get the mirror domain to load a specific page in sourcedomain such as sourcedomain.com/pagename? I tried making $wc_source = sourcedomain.com/pagename and it doesn’t work.

      • D says:

        Ok, my bad for the barrage of emails. I actually figured out how to load a specific page by changing the $URI… Last question! Stylesheets actually are not loading properly… :( Any fix for this?

  4. Blade says:

    Ok
    All is great but why after i submit data (form use POST method and Header redirect if all is correct with login)
    I not get anything and home page reload without any massage or correct redirection to member page?
    Thanks

  5. Marilou Jowell says:

    Hi, Neat post. There’s an issue together with your web site in internet explorer, would test this? IE still is the market chief and a big element of people will leave out your great writing due to this problem.

  6. Willy Helmsing says:

    I have been looking for something like this for a while. I am very happy to hear you have had success with it. I am going to surprise my partner and get myself a pack of this. Hopefully it will work for me like it has for you.

  7. George says:

    I have dropped your code in, but the images and stylesheets aren’t loading up.

    What could the issue be?

    Thanks

  8. fehmi says:

    what about if wc_source is a subfolder like domain.com/example?

  9. ImDKG says:

    Thanx buddy I have wasted lot of time in this code searching you have done a tremandous work. :)

  10. Supriyadi says:

    Hi Remiz,

    It works for a few days but today I got same message as Arash.

    Any advise to solve this issue?

    Thanks.

  11. WebHoster says:

    Wow.. great article. thanks a lot for sharing

  12. Miggy says:

    I just did this but why do I get a message Object Moved. This object may be found here (link). I thought it’s supposed to automatically redirect on its own. Did i do something wrong?

  13. Arash says:

    Hi again,
    I do appreciate your help ;)

  14. Arash says:

    Hi Remiz,
    Thanks for your nice tip :)
    I just tried it, but when I visit my “newdomain.com” it givs me the following error:

    Unable to open socked: php_network_getaddresses: getaddrinfo failed: Name or service not known (0)

    any idea?
    Thanks a lot for your time :)

Leave a Reply


nine − = 2

Subscribe via email

I’m promoting

Yellow Pages
Advertise here
More in Programming (3 of 8 articles)