Один прием скрытия внешних ссылок

В поисковой оптимизации внешние ссылки (т.е. ссылки, ведущие на другие сайты) часто играют значимую роль в различных аспектах. Например, это важно, если сайт участвует в ссылочных биржах. Для скрытия внешних ссылок обычно их «экранируют», т.е. делают переход на сайты через скрипт-редиректор, например так: <a href="/go.php?url=http://ya.ru">Яндекс.Поиск</a>.

Файл go.php должен находиться в корне сайта и может иметь примерно такое содержание:

<?php
header('Location: '.$_GET['url']);
?>

На самом деле он может быть немного сложнее и включать различные проверки, чтобы ему не подсунули битую или чужую ссылку.

Ссылки такого типа выглядят некрасиво и неудобны для читателей вашего сайта. Например, их не очень удобно публиковать или делиться. Кроме того может возникнуть ощущение жадности автора сайта. Поэтому мы предлагаем следующую технологию, основанную на javascript.

В секцию <head></head> включаем внешний javascript-файл redirector.js, расположенный в корне сайта,

<head>
...
<script src="/redirector.js" type="text/javascript"></script>
...
</head>

следующего содержания:

if(typeof $ != 'undefined') {
	$(document).ready(function(){
		$('a').each(function(){
			if(this.href.match(/go\.php\?url=(.+)(#.*)?$/) !== null)
				this.href = base64_decode(RegExp.$1)+RegExp.$2;
		});
	});
}
else{
	if (typeof window.addEventListener != 'undefined')
		window.addEventListener('load', redirectorInit, false);
	else if (typeof window.attachEvent != 'undefined')
		window.attachEvent('onload', redirectorInit);
	function redirectorInit(){
		var as = document.getElementsByTagName('A');
		for(var i = 0; i < as.length; i++) {
			if(as[i].href.match(/go\.php\?url=(.+)(#.*)?$/) !== null)
				as[i].href = base64_decode(RegExp.$1)+RegExp.$2;
		}
	}
}
function base64_decode(data) {
  // original http://kevin.vanzonneveld.net
  // http://phpjs.org/functions/base64_decode/
  var b64 =
  "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
  var o1, o2, o3, h1, h2, h3, h4, bits,
      i = 0, ac = 0, dec = "", tmp_arr = [];
  if (!data)  return data;
  data += '';
  do {
  // unpack four hexets into three octets using index points in b64
    h1 = b64.indexOf(data.charAt(i++));
    h2 = b64.indexOf(data.charAt(i++));
    h3 = b64.indexOf(data.charAt(i++));
    h4 = b64.indexOf(data.charAt(i++));
    bits = h1 << 18 | h2 << 12 | h3 << 6 | h4;
    o1 = bits >> 16 & 0xff;
    o2 = bits >> 8 & 0xff;
    o3 = bits & 0xff;
    if (h3 == 64) { tmp_arr[ac++] = String.fromCharCode(o1); }
	else if (h4 == 64) { tmp_arr[ac++] = String.fromCharCode(o1, o2); }
	else { tmp_arr[ac++] = String.fromCharCode(o1, o2, o3); }
  } while (i < data.length);
  dec = tmp_arr.join('');
  return dec;
}

Функция декодирования base64_decode была позаимствована с сайта phpjs.org.

Теперь внешние ссылки на сайт будем формировать по такой схеме /go.php?url=base64_encode_code, где base64_encode_code — это строка символов, которая формируется функцией base64_encode. Например, адрес http://ya.ru/ через функцию base64_encode преобразуется в строку aHR0cDovL3lhLnJ1Lw==. В сети есть онлайн-кодировщики, которые легко можно найти, например так.

Скрипт redirector.js ищет все ссылки на странице и отбирает те, у которых адрес (href) начинается с /go.php?url=. У таких ссылок параметр url декодируется в адрес сайта и присваиваеся адресу ссылки. Пользователю такие ссылки видятся как естественные. Их можно, например, копировать. Для поисковиков ссылка остается закодированной.

В принципе файл go.php уже не нужен, но можно подстраховаться на случай, если у пользователя отключены скрипты или произошла ошибка в выполнении, из-за которой наш скрипт не отработал. Поэтому файл go.php немного перепишем следующим образом

<?php
header('Location: '.base64_decode($_GET['url']));
?>