Мультисайтинг и .htaccess: robots.txt

Аватар пользователя andron13

robots.txtДля того чтобы в мульти-инсталляциях поисковики находили robots.txt делается следующее:

в корневой папке мульти-инстяллации, допустим это (как видно в ftp)

/multi/

Для начала в корневой папке создается файл robots.php со следующим содержанием:


header('Content-type: text/plain');
$robotstxt = "sites/" . $_SERVER['HTTP_HOST'] . "/robots.txt";
echo file_get_contents($robotstxt);
?>

(Этот скрипт берёт имя запрашивоемой домены, "лепит"(строка номер 2) из неё

"sites/" + "imja domeny" + "/robots.txt"

путь к фаилу который надо считать ( robots.txt ), считывает его, и выдаёт всё "на экран" (строка 3), выдавая в свою очередь до этого http-заголовок о том, что информация, которая последует будет в текстовом формате (строка номер 1).)

Затем в папке интересующего нас сайта, допустим http://dsl.by/, создается/копируется файл "robots.txt" с его содержанием:

/multi/sites/dsl.by/robots.txt:

# robots.txt dsl.by
#
User-agent: *
Crawl-delay: 10
# Directories
Disallow: /database/
Disallow: /includes/
Disallow: /misc/
Disallow: /modules/
Disallow: /sites/
Disallow: /themes/
Disallow: /scripts/
Disallow: /updates/
Disallow: /profiles/
#
# Paths (clean URLs)
Disallow: /admin/
Disallow: /comment/reply/
Disallow: /logout/
Disallow: /node/add/
Disallow: /search/

Обязательно вписывай имя домены в комментарий robots.txt, как для контроля, так и для того, чтобы не запутаться.

И последним шагом в корневой папке мулти-инсталляции редактируется файл

.htaccess

В него вписывается следующая директива (директивами мы называем приказы вебсерверу):

RewriteRule ^robots.txt$ http://%{HTTP_HOST}/robots.php [R=302,L]

Эта директива означает следующее:

"Переведи запрос на файл robots.txt на URL по типу http://%{имя запрашиваемой домены}/robots.php выдавая при этом код статуса 302 протокола хттп"

Код статуса 302 oznachet "Found", т.е. "нашёл".

Это можно представить себе в виде следующего диалога:

Поисковик: вебсервер, дай файл robots.txt с домены dsl.by
Вебсервер: есть такой файл, но у меня есть директива дать тебе файл robots.php с домены dsl.by
Поисковик: ок
Вебсервер: (дает файл, выдает http-code 200)
.htaccess: 12331276312612google.html & Co

Для того чтобы в мульти-инсталляциях поисковики находили файлы верификации домены google/яндека/yahoo и.т.д типа

213112312312313123google.html
yandex_231327831123123123.txt
y_key_239389123891238901.html

делается сдедуюшее:

в корневой папке мульти-инстяллации, допустим это (как видно в ftp)

/multi/

создается файл

search-engine-controlfile.php

в который вписывается следующее:


header('Content-type: text/plain');
$controlfile = "sites/" . $_SERVER['HTTP_HOST'] . "/" . basename($_REQUEST[file]);
echo file_get_contents($controlfile);
?>

("basename($_REQUEST[file])" означает "базисное имя файла". Например полное имя http://www.vovka.de/path/123.txt". А базисное имя будет тогда "123.txt". Остальная функциональная часть такая-же как и у "robots.php" (см. выше))

Вторым шагом в папке соответствующей домены, допустим dsl.by создаётся файл

google21123123123123.html

(ну или соответсвующий фаил Яндекса или Yahoo)

Полный путь это к этому файлу ( как видно в ftp):

/multi/sites/dsl.by/google21123123123123.html

Затем редактируется файл

.htaccess

В него вписываются следующие директивы:

# Control-files of search-engines
RewriteRule ^google.*html$ http://%{HTTP_HOST}/search-engine-controlfile.php?file=%{REQUEST_URI} [R=302,L]
RewriteRule ^yandex_.*\.txt$ http://%{HTTP_HOST}/search-engine-controlfile.php?file=%{REQUEST_URI} [R=302,L]
RewriteRule ^y_key_.*\.html$ http://%{HTTP_HOST}/search-engine-controlfile.php?file=%{REQUEST_URI} [R=302,L]

Эти директивы означают следующее (на примере первой):

Переведи любой запрос по типу "google.*html" на файл search-engine-controlfile.php по адресу запрашиваемой домены. При этом передай файлу ( в данном случае это PHP-скрипт, передай "ключ"/"аргумент" "file", где содержимым ключа является имя запрашиваемой домены (%{REQUEST_URI}). При этом выдавай код номер 302 протокола http.

(Точка в "google.*" означает "любой символ" а звёздочка после точки значит что символ слева от неё (звёздочки) может быть повторён любое количество раз).

пример : http://dsl.by/robots.php

© Владимир для drupal.by И drupal.ru

-------------------------------------

.

0 Thanks

Комментарии

Аватар пользователя andyceo
andyceo 10 лет назад

Огромное спасибо за статью, очень полезная! Уже заюзал на своих сайтах. Особенно понравился совет по редиректу для robots.txt.

А для того, чтобы в мульти-инсталляциях поисковики находили файлы верификации домены google/яндека/yahoo и.т.д , можно сделать следующую вещь (и по-моему, она лучше, в чём-то гибче предложенного вами метода):

Произвольный meta-теги и другие теги в head-области HTML страницы

PS: Кстати, offtop, но хочу спросить, где правильнее (логичнее) всего размещать инструкцию инклюда какой-нибудь нужно сторонней библиотеки? Например, я использую библиотеку JpGraph для построения графиков. Отдельный модуль писать нет необходимости. Так где же можно разместить инструкцию require_once ('jpgraph.php'); ? в settings.php?

Аватар пользователя Ромка
Ромка 10 лет назад

Очень полезно, спасибо. А вот такой вопрос: как при использовании мультисайтинга запаролить хтаксессом один из сайтов? То есть нужно, чтобы запаролен был только один из, например, трех сайтов...

Аватар пользователя PVasili
PVasili 10 лет назад

Сдаётся, что - никак :( . .haaccess срабатывает на уровне индейца для папок, ещё до всего. Хотя, возможно я и ошибаюсь :).

Чуть не в тему....
А в чем существенное преимущество мультисайтинга?
1) Единое обновление? - Но оно перекрывается неудобством того, что при обновлении будут в offline ВСЕ сайты в связке.
2) Размер установки(лишние файлы)? - При огромной куче модулей размер будет не больше 5-10Mb что об этом говорить несерьёзно.

Зато из минусов:
1) Необходимо быть более внимательным с установками и настройками. Любая ошибка может легко повалить все сайты.
2) Периодические глюки с общими сессиями, сложности с настойкой
3) Любой глюк и ошибки в настройках безопасности(файловой системы) автоматически вызывают проблемы на всех сайтах....

Аватар пользователя dm66
dm66 10 лет назад

Для решения проблемы с robots.txt при мультисайтинге есть так же модуль robotstxt

Аватар пользователя gorr
gorr 10 лет назад

Спасибо, полезно.

Аватар пользователя Temaprikol

Спасибо, почти все понял, кроме "google21123123123123.html" этой страницы, что означают эти цифры "21123123123123" ?? Это для каждого сайта - разные, или для гугла все-равно?

Аватар пользователя PanDa777
PanDa777 10 лет назад

На странице https://www.google.com/webmasters/tools есть "Инструменты для веб-мастеров". Они могут использоваться только если подтверждено, что вы являетесь владельцем сайта. Один из способов подтверждения - положить в корень файл, имя которого говорит вам Google. В данном случае - google21123123123123.html. Так что они для каждого сайта разные...

Аватар пользователя B.X
B.X 10 лет назад

"1) Единое обновление? - Но оно перекрывается неудобством того, что при обновлении будут в offline ВСЕ сайты в связке.
2) Размер установки(лишние файлы)? - При огромной куче модулей размер будет не больше 5-10Mb что об этом говорить несерьёзно."

Представьте, что у вас 20 сайтов... а теперь подумайте, являются ли эти пункты такими уж несерьёзными... ведь обновление, накладывание патчей - это не такая уж минимальная затрата времени даже для одного сайта...

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

Аватар пользователя PVasili
PVasili 10 лет назад

1) И все 20 будет в offline... Хотя, возможно некоторые имеют пик посещаемости вечером, некоторые утром. А offline будут все, даже в свои часы пик!
Ошибки у нормального провайдера(тем более отключение электричества) не так часты, как "свои родные" ошибки
2) Единая не всегда хорошо OpenID с лихвой заменит её...

Что быстро все делать - согласен. Что нужно быть ОСОБЕННО внимательным - другой вопрос.

Аватар пользователя VladSavitsky
VladSavitsky 9 лет назад

Можно проще - не читать инфу из robots.txt, которые разложены по папкам, а формировать все в одном php-скрипте:

Пример файла robots.php из Drupal 6:


<?php
header
('Content-type: text/plain');
echo 
'User-agent: *
Crawl-delay: 10'
.
//Directories
'
Disallow: /database/
Disallow: /includes/
Disallow: /misc/
Disallow: /modules/
Disallow: /sites/
Disallow: /themes/
Disallow: /scripts/
Disallow: /updates/
Disallow: /profiles/'
.

// Files
'
Disallow: /xmlrpc.php
Disallow: /cron.php
Disallow: /update.php
Disallow: /install.php'
.

// Paths (clean URLs)
'
Disallow: /admin/
Disallow: /comment/reply/
Disallow: /contact/
Disallow: /logout/
Disallow: /node/add/
Disallow: /search/
Disallow: /user/register/
Disallow: /user/password/
Disallow: /user/login/'
.

// Paths (no clean URLs)
'
Disallow: /?q=admin/
Disallow: /?q=comment/reply/
Disallow: /?q=contact/
Disallow: /?q=logout/
Disallow: /?q=node/add/
Disallow: /?q=search/
Disallow: /?q=user/password/
Disallow: /?q=user/register/
Disallow: /?q=user/login/'
.

// Print-version
'
Disallow: /print/
Disallow: /downloads/
Disallow: /mini/'
.

// rss
'
Disallow: /rss.xml
Disallow: /*/feed$'
.

// http://d5.drupaldev.ru/node/16176
'
Disallow: /user/register?
Disallow: /user/login?
Disallow: /taxonomy/term*/feed
Disallow: /book/export/html

User-agent: Yandex
Sitemap: http://'

.$_SERVER['HTTP_HOST'].'/sitemap.xml';
?>

В .htaccess в корне установки добавить:

RewriteRule ^robots.txt$ http://%{HTTP_HOST}/robots.php [R=302,L]
Аватар пользователя VladSavitsky
VladSavitsky 9 лет назад

Посмотрел модуль - он небольшой, но не вижу смысла использовать доп. модуль, если можно обойтись нормальным решением.

Аватар пользователя VladSavitsky
VladSavitsky 9 лет назад

Для подтверждения владения доменом можно использовать такой же прием.

В файл .htaccess добавить:

# Control-files of search-engines
RewriteRule ^google.*html$ http://%{HTTP_HOST}/controlfile.php?file=%{REQUEST_URI} [R=302,L]
RewriteRule ^yandex_.*\.txt$ http://%{HTTP_HOST}/controlfile.php?file=%{REQUEST_URI} [R=302,L]
RewriteRule ^y_key_.*\.html$ http://%{HTTP_HOST}/controlfile.php?file=%{REQUEST_URI} [R=302,L]
RewriteRule ^WMT-.*\.HTML$ http://%{HTTP_HOST}/controlfile.php?file=%{REQUEST_URI} [R=302,L]
RewriteRule ^LiveSearchSiteAuth.xml$ http://%{HTTP_HOST}/controlfile.php?file=%{REQUEST_URI} [R=302,L]

В корневой папке мульти-инсталляции (допустим это /multi) создается файл controlfile.php:

<?php
<?
header('Content-type: text/plain');
$filename=basename($_REQUEST[file]);
switch (
$_SERVER['HTTP_HOST']) {
    case 
'drupalcookbook.ru':
          switch (
$filename) {
              case 
'google876876876.html':
                    echo 
'';
                    break;
              case 
'WMT-987987987987.HTML':
                    echo 
'23234234234234';
                    break;
              case 
'y_key_23234234234234.html':
                    echo 
'23234234234234';
                    break;
              case 
'LiveSearchSiteAuth.xml':
                    echo 
'23234234234234';
                    break;
              case 
'yandex_23234234234234.txt':
                    echo 
'23234234234234';
                    break;
          }
          break;
    case 
'drupalon.ru':
          break;
}
?>
Аватар пользователя VladSavitsky
VladSavitsky 9 лет назад

Яндекс не видит robots.txt по редиректу.
Альтернатива: http://www.drupal.ru/node/20749

Короче, поставил модуль robotstxt и яндекс увидел таки это файл....

Аватар пользователя keereel@drupal.org
keereel@drupal.org 9 лет назад

я, может, чего-то не понимаю? зачем для подтверждения владения доменом нужно писать скрипты? Имена файлов для каждого сайта, по идее, должны отличаться друг от друга - так почему же нельзя положить их, по инструкции, в корень? Единственное исключение - подтверждение для Live, но, мне кажется, в этом случае можно в один файл поместить все коды подтверждения..

UPD: с Google, Live и Yahoo всё проще оказалось - там для всех сайтов (если, конечно, они все в одном профиле) код подтверждения один и тот же, т.е. подтверждается не сайт, а вебмастер. Только Яндекс требует отдельного файла для каждого сайта, но они успешно уживаются в одной - корневой - папке.

Аватар пользователя keereel@drupal.org
keereel@drupal.org 9 лет назад

Подскажите, как быть в моём случае. В htaccess я прописал следующие строки:

RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ http://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

для того, что бы избавиться от зеркал и перенаправлять все обращения на сайты с www.

После этого вышеприведённый пример не работает, потому что robots.txt ищется в папке, соответственно, с www:

PHP Warning: file_get_contents(sites/www.site.ru/robots.txt) [<a href='function.file-get-contents'>function.file-get-contents</a>]: failed to open stream: No such file or directory in robots.php on line 4

В sites, естественно, домены прописаны без "www": site1.ru и site2.ru.

Как быть? Можно было бы в sites создать дополнительные папки с www, но не хотелось бы создавать лишнего..

Ну и, кстати, хотел ещё спросить.. Зачем перенаправлять запрос сначала в php, а уже оттуда - в robots.txt? Нельзя ли сразу перенаправлять в нужный robots.txt? Или всё дело в заголовках, которые в этом случае не будут корректно прописываться?

Аватар пользователя vikont
vikont 8 лет назад

На Друпале 5* сделал все как написано в статье! Все заработало сразу, кроме проверочных файлов! И то, как то странно ведет себя, после установки Поисковики увидели проверочные файлы, а через несколько дней подключал еще сайты и уже отказались видеть. Поисковики видят проверочный файл по пути http://мой_домен/search-engine-controlfile/проверочный_файл. Как исправить путь?