скрыть внешние ссылки с сайта
Вот. Потратил день. Если кому надо хоть отпишитесь что мол пригодилось...
файл 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.
|
Спасибо, познавательно!
Вот возникла мысль что надо как-то ограничить запросы к фалу 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 в эту самую папку.
ссылки пишем без первого слеша.
не так:
а так:
файл
php.ini
(если не можете менять основной файл, создайте php.ini в там же где лежит папка public_html? тобиш рядом).include_path = ".:/usr/lib/php:/home/user/zendgdata/library/:/home/user/public_html/private/"
чета мне кажется я какой-то бред написал.... ща попробую... чёт не получается
надо что-то в самом php коде писать.
Но зачем?
По правде говоря,я понял, что эта штука транслирует ссылки в/из base64 и делает редирект по ним. Очевидно, это сделано в целях... Ну, допустим, в целях безопасности или SEO. Где тут очевидная выгода от такого усложнения?
2ixith:
base64 для того, чтобы "паук" уж точно не смог прочитать куда ведёт ссылка. Ведь мы же не в курсе как там у поисковиков на самом деле все происходит.
Кстате, надо бы их еще как-то в robots.txt запретить.
Остается открытым вопрос как быть с безопасностью url.php - что бы тот не принимал запросы со сторонних ресурсов.
base64 нужен что бы спец символы корректно передавались.
Можно добавить проверку заголовока Referer, но это не 100% гарантия. Тут действительно база нужна, а все никак не доползу до полноценной CMS ленивый видать...
Ну и вобщем тут после очередного потраченного дня я вдруг понял, что если кто-то будет ставить ссылку на скрипт на моём сайте - так это только плюс! Лишняя входящая внешняя (если можно так выразиться) ссылка лишней не будет. А накладные расходы от такого скрипта не велики...я надеюсь...
Давно использую подобный метод, но чисто на PHP без подсветки ссылок в строке статуса браузера. Не вижу смысла демонстрировать ссылки в браузере для клиента, раз уж они скрыты. Если нужно прокомментировать переход, то проще написать в title - "главная страница Яндекса" или прямо url, если хотите.
Все это действительно нужно для SEO, чтобы поисковики не учитывали внешние ссылки с сайта и не передавали вес на сторонние ресурсы. Для этого нужно в robots.txt прописать в данном случае: Disallow: /url.php
предположим что на сайте 1.ru есть этот скрипт, а сайт 2.ru ссылается на сайт 3.ru через скрипт сайта 1.ru. Если в тоге редирект пройдет на сайт 3.ru, то вес page rank перейдет сайту 3.ru или 2.ru ?
конечно перейдет!! вы только подумайте, это просто как раз-два-три!
Закодированная ссылка такого вида _http://www.ya.ru (переход по ссылке сработает)
Закодированная ссылка такого вида _http://www.ya.ru/ (переход по ссылке не сработает)
Закодированная ссылка такого вида _http://www.ya.ru/страница.php (переход по ссылке не сработает)
Или я туплю?
лучше использовать POST вместо GET. Надежнее
Отправить комментарий
Приветствуются комментарии:Для остальных вопросов и обсуждений есть форум.