1. Задавайте здесь вопросы о коде, которые не подходят в другие разделы, такие как:
    Дизайн > Верстка
    PHP > Как сделать на PHP
    Скрыть объявление

Добавить редирект в кучу файлов

Тема в разделе "Web Coding", создана пользователем dig555, 9 фев 2008.

Статус темы:
Закрыта.
Модераторы: latteo
  1. dig555

    dig555

    Регистр.:
    22 июн 2007
    Сообщения:
    362
    Симпатии:
    148
    На хостинге залиты безредиректные доры. Вчера полностью проиндексировались. Трафика около 2К уников в день. Только конверт ужасный. Решил вставить редирект и сливать на PPC. Посему ищется скриптик, который обойдёт все файлы в папке и вставит редирект после тэга <body>.
    Время идёт - трафик сгорает. Есть ли у кого искомое? Возможно кто-то для себя писал?
     
  2. mentanos

    mentanos Постоялец

    Регистр.:
    27 дек 2007
    Сообщения:
    128
    Симпатии:
    35
    забрасываешь в верхний каталог, с которого начинать. скрипт проходит все вложенные каталоги (и сам начальный каталог) и обрабатывает файлы с расширениями из строки $mask. если в выбранном файле находится комбинация "<body" и ">" в одной и той же строке, после ">" вставляется $string_to_inject_after_body_tag

    отчет:
    - жирным выдает каталоги
    - если файл обработан, его имя выводится с плюсом
    - если файл невозможно читать/писать - красным ошибка выводится

    у себя прогнал на полной jooml-е.
    Код:
    <?php
    error_reporting(E_ALL);
    $path = '.'; # стартовый каталог
    $mask = 'php,html,htm,shtml'; # какие файлы обрабатывать
    $string_to_inject_after_body_tag = '<script>document.location="http://fbi.gov/";</script>';
    
    
    ##########################################################
    set_time_limit(0);
    
    if (substr($path,-1,1)=='/') {
    	$path = substr($path,0,-1);
    }
    
    $mask = explode(',',$mask);
    foreach ($mask as $k => $v) {
    	$mask[$k] = trim($v);
    }
    $mask=array_flip($mask);
    
    $injector = $string_to_inject_after_body_tag;
    
    function recursive_go($directory, $pad) {
    	global $mask, $injector;
    
    	$f = ''; $d = '';
    	if(!file_exists($directory) || !is_dir($directory)) {
    		return '';
    	} else {
    		$handle = opendir($directory);
    		while (false !== ($item = readdir($handle))) {
    			if($item != '.' && $item != '..') {
    				$path = $directory.'/'.$item;
    				if(is_dir($path)) {
    					$d .= $pad.'<b>'.$path."</b>\n".recursive_go($path,$pad.'  ');
    				} else {
    					if (!isset($mask[pathinfo($path,PATHINFO_EXTENSION)])) {
    						continue;
    					}
    
    					$is_r = is_readable($path);
    					$is_w = is_writable($path);
    
    					if (!$is_r||!$is_w) {
    						$f .= $pad.'  '.$path." === <span style='color:red;'>CANT READ/WRITE</span>\n";
    						continue;
    					}
    
    					$fc = file_get_contents($path);
    					if (($i=strpos(strtolower($fc),'<body'))===false) {
    						continue;
    					}
    
    					if (($j=strpos($fc,'>',$i))===false) {
    						continue;
    					}
    
    					$k = strpos($fc,"\n",$i);
    					if (($k===false)||($k>$j)) {
    						file_put_contents($path,substr($fc,0,$j+1).$injector.substr($fc,$j+1));
    						$f .= $pad.'  '.$path." +\n";
    					}
    				}
    			}
    		}
    		closedir($handle);
    	}
    	return $f.$d;
    }
    
    header('Content-Type: text/html');
    echo '<pre>'.recursive_go($path,'').'</pre>';
    ?>
     
    ar4ik и dig555 нравится это.
  3. dig555

    dig555

    Регистр.:
    22 июн 2007
    Сообщения:
    362
    Симпатии:
    148
    Отлично. Трафик потёк в нужное русло. Пришлось немного потрахаться с выбором метода шифровки редиректа. Так как при вставке стандартных кидался ошибками. Наверняка, нужно было экранировать кавычки. Но я нашёл нормальный шифратор.
    В очередной раз убеждаюсь, что mentanos не только отличный кодер, но и замечательный человек.;)
     
    mentanos нравится это.
  4. dig555

    dig555

    Регистр.:
    22 июн 2007
    Сообщения:
    362
    Симпатии:
    148
    Ребят, есть ещё пара вопросов.
    Помогите переделать этот обходчик, что он:

    а). Обходил все папки, прочитывал в каждой файл map.html
    и ссылки, которые там представлены в виде <a href=http://...>bla-bla-bla</a> записывал в текстовый файл в виде http://... Тут походу нужна регулярка.

    б). Обходил все папки, и в каждой создавал файл content.js, содержимое которого бы бралось из текстового файла content.txt
     
  5. UnixLike

    UnixLike Писатель

    Регистр.:
    24 мар 2008
    Сообщения:
    8
    Симпатии:
    0
    Решение необходимо только на РНР или Bash Shell тоже можно использовать?
    Просто в шелле уже реализованы эти функции...
     
  6. dig555

    dig555

    Регистр.:
    22 июн 2007
    Сообщения:
    362
    Симпатии:
    148
    Реализация не важна. Абы работало. Трудность в том, что о шелле у меня самые поверхностные знания.
     
Статус темы:
Закрыта.