Javascript.RU

скрыть внешние ссылки с сайта

Вот. Потратил день. Если кому надо хоть отпишитесь что мол пригодилось...
файл url.php (кидаем в корень)
немного изменил, чтобы исправлялись ошибки http(S)// или hTTp(s):/ на http(s):// если javascript отключен.
И также, если к скрипту обратился какой-то нахал, то скрипт редиректит на вашу главную страницу (последний else)

<?php
$ref = explode("/", $_SERVER['HTTP_REFERER']);
if($ref[2] == $_SERVER['SERVER_NAME']){
	$url = (isset($_GET['url']) and $_GET['url']) ? base64_decode($_GET['url']) : '';
	if ($url) {
		if(preg_match("/http[s].*\//i", $url)){
			$url = preg_replace("/http[s].*\//i", "https://", $url);
			header("Location: $url");
			} else if(preg_match("/http.*\//i", $url)){
				$url = preg_replace("/http.*\//i", "http://", $url);
				header("Location: $url");
				} else {
					header("Location: http://$url");
					}
	}
}else{
	header("Location: http://".$_SERVER['HTTP_HOST']);
	}
?>

Ссылки ставим так:
файл index.php (или index.html)

<html><head>
js не умеет декодировать base64. Научим его:
<script type="text/javascript">
/**
*  Вот тут в подробности можно не вдаваться, взял с base64.ru
*  Base64 encode / decode
*  webtoolkit.info
*
**/
var Base64 = {_keyStr:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=", encode:function(input) {
  var output = "";
  var chr1, chr2, chr3, enc1, enc2, enc3, enc4;
  var i = 0;
  input = Base64._utf8_encode(input);
  while(i < input.length) {
    chr1 = input.charCodeAt(i++);
    chr2 = input.charCodeAt(i++);
    chr3 = input.charCodeAt(i++);
    enc1 = chr1 >> 2;
    enc2 = (chr1 & 3) << 4 | chr2 >> 4;
    enc3 = (chr2 & 15) << 2 | chr3 >> 6;
    enc4 = chr3 & 63;
    if(isNaN(chr2)) {
      enc3 = enc4 = 64
    }else {
      if(isNaN(chr3)) {
        enc4 = 64
      }
    }
    output = output + this._keyStr.charAt(enc1) + this._keyStr.charAt(enc2) + this._keyStr.charAt(enc3) + this._keyStr.charAt(enc4)
  }
  return output
}, decode:function(input) {
  var output = "";
  var chr1, chr2, chr3;
  var enc1, enc2, enc3, enc4;
  var i = 0;
  input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");
  while(i < input.length) {
    enc1 = this._keyStr.indexOf(input.charAt(i++));
    enc2 = this._keyStr.indexOf(input.charAt(i++));
    enc3 = this._keyStr.indexOf(input.charAt(i++));
    enc4 = this._keyStr.indexOf(input.charAt(i++));
    chr1 = enc1 << 2 | enc2 >> 4;
    chr2 = (enc2 & 15) << 4 | enc3 >> 2;
    chr3 = (enc3 & 3) << 6 | enc4;
    output = output + String.fromCharCode(chr1);
    if(enc3 != 64) {
      output = output + String.fromCharCode(chr2)
    }
    if(enc4 != 64) {
      output = output + String.fromCharCode(chr3)
    }
  }
  output = Base64._utf8_decode(output);
  return output
}, _utf8_encode:function(string) {
  string = string.replace(/\r\n/g, "\n");
  var utftext = "";
  for(var n = 0;n < string.length;n++) {
    var c = string.charCodeAt(n);
    if(c < 128) {
      utftext += String.fromCharCode(c)
    }else {
      if(c > 127 && c < 2048) {
        utftext += String.fromCharCode(c >> 6 | 192);
        utftext += String.fromCharCode(c & 63 | 128)
      }else {
        utftext += String.fromCharCode(c >> 12 | 224);
        utftext += String.fromCharCode(c >> 6 & 63 | 128);
        utftext += String.fromCharCode(c & 63 | 128)
      }
    }
  }
  return utftext
}, _utf8_decode:function(utftext) {
  var string = "";
  var i = 0;
  var c = c1 = c2 = 0;
  while(i < utftext.length) {
    c = utftext.charCodeAt(i);
    if(c < 128) {
      string += String.fromCharCode(c);
      i++
    }else {
      if(c > 191 && c < 224) {
        c2 = utftext.charCodeAt(i + 1);
        string += String.fromCharCode((c & 31) << 6 | c2 & 63);
        i += 2
      }else {
        c2 = utftext.charCodeAt(i + 1);
        c3 = utftext.charCodeAt(i + 2);
        string += String.fromCharCode((c & 15) << 12 | (c2 & 63) << 6 | c3 & 63);
        i += 3
      }
    }
  }
  return string
}};
</script>
делаем ссылки нормальными при наведении мышки, вернее при загрузке body все ссылки из кривых становятся нормальными и браузеры показывают их так как надо. Конечно, если клээнт не отключил js. Кстате, в этом варианте серфер естественно увидит реф ссылку и может её обрезать, так что если собираетесь использовать для этого - надо в js соответствующие изменения сделать.
# i добавляет регистронезависимый поиск
# подсветка js в этом блоге немного неправильно работает - путает с комментариями.

<script type="text/javascript">
function base64tonormal() {
	var allA = document.getElementsByTagName('a');
	for (var i = 0; i < allA.length; ++i) {
		var a = allA[i];
		if (/(.*)url\.php\?url\=/i.test(a.toString())) {
			var x = a.toString().replace(/(.*)url\.php\?url\=/i,'');
			var x64 = Base64.decode(x);
			if(/http[s].*\//i.test(x64)){
				var x64 = x64.replace(/http[s].*\//i,'');
				a.href='https://'+x64;
				} else if(/http.*\//i.test(x64)){
				var x64 = x64.replace(/http.*\//i,'');
				a.href='http://'+x64;
				} else {
					a.href='http://'+x64;
				}
		}
	}
}
</script>
</head>
<body onLoad="base64toNormal()">
внешние ссылки:<br> ссылки заведомо написаны с ошибками! Посмотрите как их видет браузер.
<a href="/url.php?url=aFRUcDovL3d3dy55YS5ydQ==">hTTp://www.ya.ru</a><br>
<a href="/url.php?url=aHR0cDovL3d3dy55YS5ydQ==">http://www.ya.ru</a><br>
<a href="/url.php?url=aHR0cC8vd3d3LnlhLnJ1">http//www.ya.ru</a><br>
<a href="/url.php?url=d3d3LnlhLnJ1">www.ya.ru</a><br>
<a href="/url.php?url=aHR0cHMvd3d3LnlhLnJ1">https/www.ya.ru</a><br>
<a href="/url.php?url=aHR0cHM6Ly93d3cueWEucnU=">https://www.ya.ru</a><br>
</body></html>

кстате полезная штука base64.ru (когда будете свои ссылки ставить)

вот тут можете в сборе посмотреть http://shkur.ru/base64/

Вычитал, что некоторые поисковики все же переходят по редиректам, так что как посоветовал javs надо закрывать url.php в robots.txt (прописать в данном случае: Disallow: /url.php)

P.S. Ведь наверняка уже это есть в CMS'ах? если да то хде?
P.P.S. Разве робот (поисковик) не сможет декодировать ссылки?
P.P.P.S. Сильно не пинайте - я нуб.!
P.P.P.P.S. И спасбо Илье за сайт. И гуглу за Google Closure Compiler.

+1

Автор: Гость (не зарегистрирован), дата: 20 сентября, 2010 - 21:21
#permalink

Спасибо, познавательно!


Автор: shkur, дата: 20 сентября, 2010 - 23:16
#permalink

Вот возникла мысль что надо как-то ограничить запросы к фалу url.php
что бы низзя было к нему обратиться с другого ресурса.
Я вижу такой вариант:
кладем url.php в папку недоступную из тырнета. Делается например средствами apache в файле .htaccess
/private/.htaccess
AuthType Basic
AuthName "private"
AuthUserFile "/home/user/.htpasswds/public_html/example.com/private/passwd"
require valid-user

Дальше кидаем url.php в эту самую папку.
ссылки пишем без первого слеша.
не так:

<a href="/url.php?url=aHR0cDovL3d3dy55YS5ydQ==">http://www.ya.ru</a>

а так:

<a href="url.php?url=aHR0cDovL3d3dy55YS5ydQ==">http://www.ya.ru</a>

файл php.ini (если не можете менять основной файл, создайте php.ini в там же где лежит папка public_html? тобиш рядом).
include_path = ".:/usr/lib/php:/home/user/zendgdata/library/:/home/user/public_html/private/"

чета мне кажется я какой-то бред написал.... ща попробую... чёт не получается
надо что-то в самом php коде писать.


Автор: ixth, дата: 21 сентября, 2010 - 10:25
#permalink

Но зачем?
По правде говоря,я понял, что эта штука транслирует ссылки в/из base64 и делает редирект по ним. Очевидно, это сделано в целях... Ну, допустим, в целях безопасности или SEO. Где тут очевидная выгода от такого усложнения?


Автор: shkur, дата: 21 сентября, 2010 - 13:20
#permalink

2ixith:
base64 для того, чтобы "паук" уж точно не смог прочитать куда ведёт ссылка. Ведь мы же не в курсе как там у поисковиков на самом деле все происходит.
Кстате, надо бы их еще как-то в robots.txt запретить.

Остается открытым вопрос как быть с безопасностью url.php - что бы тот не принимал запросы со сторонних ресурсов.


Автор: shkur, дата: 22 сентября, 2010 - 02:47
#permalink

base64 нужен что бы спец символы корректно передавались.

Можно добавить проверку заголовока Referer, но это не 100% гарантия. Тут действительно база нужна, а все никак не доползу до полноценной CMS ленивый видать...
Ну и вобщем тут после очередного потраченного дня я вдруг понял, что если кто-то будет ставить ссылку на скрипт на моём сайте - так это только плюс! Лишняя входящая внешняя (если можно так выразиться) ссылка лишней не будет. А накладные расходы от такого скрипта не велики...я надеюсь...


Автор: javs, дата: 22 сентября, 2010 - 03:23
#permalink

Давно использую подобный метод, но чисто на PHP без подсветки ссылок в строке статуса браузера. Не вижу смысла демонстрировать ссылки в браузере для клиента, раз уж они скрыты. Если нужно прокомментировать переход, то проще написать в title - "главная страница Яндекса" или прямо url, если хотите.

Все это действительно нужно для SEO, чтобы поисковики не учитывали внешние ссылки с сайта и не передавали вес на сторонние ресурсы. Для этого нужно в robots.txt прописать в данном случае: Disallow: /url.php


Автор: shkur, дата: 24 сентября, 2010 - 15:38
#permalink

предположим что на сайте 1.ru есть этот скрипт, а сайт 2.ru ссылается на сайт 3.ru через скрипт сайта 1.ru. Если в тоге редирект пройдет на сайт 3.ru, то вес page rank перейдет сайту 3.ru или 2.ru ?


Автор: Gorik (не зарегистрирован), дата: 14 января, 2011 - 05:19
#permalink

конечно перейдет!! вы только подумайте, это просто как раз-два-три!


Автор: Гость (не зарегистрирован), дата: 29 марта, 2011 - 22:46
#permalink

Закодированная ссылка такого вида _http://www.ya.ru (переход по ссылке сработает)
Закодированная ссылка такого вида _http://www.ya.ru/ (переход по ссылке не сработает)
Закодированная ссылка такого вида _http://www.ya.ru/страница.php (переход по ссылке не сработает)
Или я туплю?


Автор: Михаил198009 (не зарегистрирован), дата: 3 апреля, 2012 - 21:22
#permalink

лучше использовать POST вместо GET. Надежнее


Отправить комментарий

Приветствуются комментарии:
  • Полезные.
  • Дополняющие прочитанное.
  • Вопросы по прочитанному. Именно по прочитанному, чтобы ответ на него помог другим разобраться в предмете статьи. Другие вопросы могут быть удалены.
    Для остальных вопросов и обсуждений есть форум.
P.S. Лучшее "спасибо" - не комментарий, как все здорово, а рекомендация или ссылка на статью.
Содержание этого поля является приватным и не предназначено к показу.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Разрешены HTML-таги: <strike> <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <u> <i> <b> <pre> <img> <abbr> <blockquote> <h1> <h2> <h3> <h4> <h5> <p> <div> <span> <sub> <sup>
  • Строки и параграфы переносятся автоматически.
  • Текстовые смайлы будут заменены на графические.

Подробнее о форматировании

CAPTCHA
Антиспам
8 + 5 =
Введите результат. Например, для 1+3, введите 4.
 
Поиск по сайту
Другие записи этого автора
Больше записей нет. Прокомментируйте эту запись - может быть, тогда он что-нибудь еще хорошее напишет ;)
Содержание

Учебник javascript

Основные элементы языка

Сундучок с инструментами

Интерфейсы

Все об AJAX

Оптимизация

Разное

Дерево всех статей

Популярные таги
Последние комментарии
Последние темы на форуме
Forum