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

Главные вкладки

Аватар пользователя andron13 andron13 11 мая 2008 в 16:35

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

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

/multi/

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

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

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

.

Комментарии

Аватар пользователя andyceo andyceo 11 мая 2008 в 20:03

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

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

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

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

Аватар пользователя Ромка Ромка 12 мая 2008 в 11:41

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

Аватар пользователя PVasili PVasili 17 мая 2008 в 23:37

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

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

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

Аватар пользователя PanDa777 PanDa777 17 мая 2008 в 21:54

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

Аватар пользователя B.X B.X 17 мая 2008 в 23:58

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

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

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

Аватар пользователя PVasili PVasili 18 мая 2008 в 11:06

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

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

Аватар пользователя VladSavitsky VladSavitsky 25 октября 2008 в 21:48

Можно проще - не читать инфу из 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 25 октября 2008 в 21:57

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

Аватар пользователя VladSavitsky VladSavitsky 25 октября 2008 в 22:53

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

В файл .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;
}
?>
Аватар пользователя keereel@drupal.org keereel@drupal.org 22 мая 2009 в 17:19

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

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

Аватар пользователя keereel@drupal.org keereel@drupal.org 22 мая 2009 в 17:24

Подскажите, как быть в моём случае. В 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 12 ноября 2009 в 19:21

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