Внедрение новой строки во все документы статического сайта
Изменить что-то во всех html-файлах статического сайта с тысячами страниц (например, добавить сообщение о переезде) - гораздо более простое дело, чем кажется.
Во-первых, надо иметь локальную копию сайта на компьютере, да и "издеваться", пожалуй, не над ней, а над копией копии :)
Во-вторых, должен быть доступ по ftp и Ваше умение работать с ним, иначе задача теряет смысл.
При всей "разнокалиберности" страниц статического сайта у всех них должно быть что-то общее - например, наличие тега <body> ... </body>
. Другое дело, что открывающая часть тега может содержать разные атрибуты на разных страницах, так что замену лучше всего делать с помощью регулярного выражения:
//$s - строка с содержимым файла, например, получена методом file_get_contents $s2=preg_replace ("/(<body[^>]*>)/msi","$1\nНОВЫЙ_ТЕКСТ\n",$s);
Здесь НОВЫЙ_ТЕКСТ
(с символами перевода строки до и после него) добавляется после открывающей части
тега body, то есть, в самом верху каждой страницы.
Вместо величины НОВЫЙ_ТЕКСТ
обычно целесообразно поставить небольшой яваскрипт, который мог бы
автоматически сформировать адрес новой страницы. Например, если скрипт с именем script.js
"лежит" в корневой папке
сайта pers.narod.ru
, получится такой НОВЫЙ_ТЕКСТ
:
<script type=\"text/javascript\" src=\"http://pers.narod.ru/script.js\"></script>
Символ "обратный слеш" перед всеми двойными кавычками необходим - так как код будет внедрён внутрь строки в двойных кавычках.
А что делать с теми долями процента пользователей, у которых выключен Яваскрипт? Думаю, не стоит пренебрегать и ими - дополним величину НОВЫЙ_ТЕКСТ
тегом <noscript>
, в котором напишем, например, ссылку на статическую страницу, где описан переезд:
<noscript><p>Этот сайт переехал. Подключите Javascript, чтобы увидеть новый адрес страницы или перейдите к <a href=\"http://nickolay.info/адрес_статьи.html\">статье</a></p></noscript>
Добавив это после </script>
и слив всё в одну строку, получим искомую строчку для замены.
Внедрение нового текста непосредственно перед закрытием тега </body>
, то есть, "в самом низу", было бы ещё проще -
регулярное выражение заменится на
$s2=preg_replace ("/(<\/body>)/msi","\nНОВЫЙ_ТЕКСТ\n$1",$s);
Используя это и перебирая файлы по списку как в этой заметке (список составлен абсолютно так же), получим следующий код:
<?php echo '<html><head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Замена в файлах по списку с сохранением структуры папок</title> </head><body>'; $path="C:/Temp/ukoz/"; //Общая часть путей, лучше с прямым слешем, а не обратным и слеш в конце $lines = file('1.txt'); $ok=$bad=$all=0; $error=''; foreach ($lines as $line) { $line=rtrim($line); $line=str_replace ('\\','/',$line); //Заменяем слеши на обратные $s=file_get_contents ($line); if ($s===false) { $error.=$line.'<br>'; $bad++; } else { $s2=preg_replace ("/(<body[^>]*>)/msi","$1\nНОВЫЙ_ТЕКСТ\n",$s); $nextfile = explode("$path", $line); $filename= substr(strrchr ($nextfile[1],'/'),1); //Имя файла без слеша в начале if (empty($filename)) $filename=$nextfile[1]; $filepath=array(); if ($filename!=$nextfile[1]) $filepath= explode("$filename", $nextfile[1]); else $filepath[0]='./'; //Путь к файлу - или текущая папка, если в корневой папке поддерева if (!is_dir($filepath[0])) @mkdir($filepath[0]); //Если папка ещё не создана - создать $i=@file_put_contents (''.$filepath[0].$filename,$s2); if ($i<1) { $error.=$line.'<br>'; $bad++; } else $ok++; } $all++; } echo '<p>Всего обработано файлов из списка: '.$all; echo '<p>Успешно скопировано: '.$ok; echo '<p>Ошибок: '.$bad.'<br>'.$error; echo '</body></html>'; ?>
Здесь предполагается, что строка внедряется в начало документа, сразу после <body>
.
Наконец, рассмотрим содержимое самого файла script.js
. Если нам просто нужно заменить домен во всех адресах, скажем,
pers.narod.ru
на nickolay.info
, полный код скрипта будет выглядеть так:
var url = window.location.toString().replace('pers.narod.ru','nickolay.info'); document.writeln ('<p>Постоянный адрес этой страницы: <a href="'+url+'">'+url+'</a></p>');
Ну и можно любой другой текст добавить в document.writeln
. Ошибкой было бы
window.location.replace(...)
- попытается сменить URL страницы :)
Массовую перекодировку файлов, которая тоже бывает нужна при переездах, проще всего сделать по рецепту с этой страницы блога.
Что касается прямого редиректа на новые страницы, выполняемого директивой
<meta http-equiv="refresh" content="0; url=новый_сайт">
помещаемой в тег <head>
документа, обычно такое на бесплатных хостингах запрещено и банится как дорвеи.
После этого осталось взять изменённые файлы из папки PHP-скрипта и "залить" обратно на хостинг, сегодня обработал так пару сайтов, в том числе и свой на бывшем "Народе" - всё ради того, чтоб постепенно убрать их с "Юкоза"... Каждый сайт отнял не более получаса.
18.04.2013, 17:41 [11340 просмотров]