Categories: Programming

Permanent URL masking for mirroring website using php and htaccess

Load originalsite.com content to newsite.com url with all links working straight from newsite.com without iframe. Just php and htaccess goodness

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.
[code] [/code]
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?

[code]
# index.php
‘;
$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(‘/

/i’,$content) ) { echo( preg_replace(‘//i’,’‘.$base,$content,1) ); }
else { echo ( str_replace($wc_source,$wc_mirror,preg_replace(‘/]+)>/i’,”“.$base,$content,1) ));
}
?>
[/code]
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.
[code]
#htaccess file

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]

[/code]
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

Remiz

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

View Comments

  • Hi Remiz,

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

    Any advise to solve this issue?

    Thanks.

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

  • 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 :)

Recent Posts

Revolutionizing Web Development with AI: Tools and Techniques for Improved Productivity and Accuracy

AI is being used in programming to improve efficiency, accuracy and automation. It is being used in machine learning algorithms…

1 year ago

Apple push notification php example code 2021

For a long time since Push notification became a thing on iOS, it was very simple to integrate push notification…

3 years ago

Solved: MySQL convert_tz returns null on MacOS Catalina using XAMPP

Note: A little bit of a story since I haven't been writing for a while. If you are in a…

5 years ago

Why You Should Hire a Creative Marketing Agency for Your Next Campaign

There are few things that are quite as universally important in a business like marketing. Good marketing is at the…

5 years ago

Bring back PPTP VPN on iOS 10 and macOs sierra

Since latest iOS and macOs removed support for PPTP VPN from their built in client, here is how you can…

8 years ago

This will Change

Back to habits of young days. Shaping up another life. Starting like a kid who is a great king.

10 years ago