Микро-цмс

Тема в разделе "Как сделать...", создана пользователем 4erepaha13, 6 окт 2010.

Статус темы:
Закрыта.
  1. 4erepaha13

    4erepaha13

    Регистр.:
    20 июн 2009
    Сообщения:
    155
    Симпатии:
    17
    Есть идея для малостраничных сайтов- исходный контент лежит в папке в десятке тхт файлов.
    Дизайн и навигация прописана в index.php.
    Как реализовать две вещи:
    1. По обращению index.php?p=page1 загружается страница page1.txt
    2. Исходный текст этой страницы проверяется на совпадение ключевых слов с словами из файла ankor.txt (вида анкор1;www.site.ru анкор2;www.site2.ru) и при наличии делает слово ссылкой.
     
  2. Murdok

    Murdok

    Регистр.:
    1 окт 2006
    Сообщения:
    236
    Симпатии:
    84
    1. в нужном месте можете поставить echo file_get_contents($_GET['p']);

    2. $content = 'buy phentermine';
    $ankor = 'phentermine';
    $content = preg_replace("/($ankor)/",'<a href="">$1</a>',$content);
    echo $content;
     
    4erepaha13 нравится это.
  3. 4erepaha13

    4erepaha13

    Регистр.:
    20 июн 2009
    Сообщения:
    155
    Симпатии:
    17
    есть ли чисто секьюрные дыры в таком формате вызова? чтобы злоумышленник не подставлял чтото типа p=...спамный урл или какой другой вредный код

    тут скорее гет-контент присвоить переменной, а потом в цикле по очереди ее опросить на наличие какого либо анкора из исходного списка
     
  4. jo0o00nyy

    jo0o00nyy Постоялец

    Регистр.:
    12 май 2010
    Сообщения:
    65
    Симпатии:
    27
    Как вариант можно так:
    Код:
    $page = (isset($_GET['p']) ? $_GET['p'] : 'index');
    $dir = './txt/'; //папка где лежат файлы с контентом
    $filename = $dir . $page . '.txt';
    if (!preg_match('/^[a-z0-9]+$/i', $page) || !file_exists($filename))
    $filename = $dir . '404.txt';
    $content = file_get_contents($filename);
    
    P.S. код писал без проверки
     
  5. venetu

    venetu

    Регистр.:
    28 мар 2007
    Сообщения:
    735
    Симпатии:
    261
    Главная дыра тут - в $_GET[p].
    Чтоб 100% себя обезопасить, делай
    PHP:
    $page = (int) $_GET[p];
    if (!
    is_file("pages/$page.txt")) $page 1// по умолчанию
    $str file_get_contents("pages/$page.txt");
    ...
    Минус этого способа в том, что у тебя файлы должны будут иметь названия 1.txt 2.txt и т.д., т.е. не всегда понятно, какой файл за какую страницу отвечает.

    Можно в принципе зайти и с обратной стороны:
    PHP:
    $pages = array();
    $h opendir('./pages');
    while(
    $f readdir($h)) if ($f[0] != '.'$pages[] = $f;
    $page $_GET[p];
    if (!
    in_array("$page.txt"$pages)) $page 'index';
    $str file_get_contents("pages/$page.txt");
    ...
    Главное помни - в $_GET[p] может быть '../../../../etc/passwd' в самых немыслимых вариациях (с бекспейсом, нуль-символом, в левой кодировке, с кучей слешей, короче как угодно.. все не отфильтруешь)
     
  6. t3s

    t3s

    Регистр.:
    16 фев 2008
    Сообщения:
    719
    Симпатии:
    290
    когда-то делал себе минидвижок, и по-моему если страниц мало (до 100) эффективнее иметь один файл, в котором содержимое страниц - это строки в этом файле, также єто избавляет от описанной venetu проблемы

    специально не тестил, но имхо при небольшом кол-ве страниц так должно работать быстрее, чем 1 страница = 1 файл

    по такому же принципу посторена CuteNews - бабушка всем известного DLE
     
  7. 4erepaha13

    4erepaha13

    Регистр.:
    20 июн 2009
    Сообщения:
    155
    Симпатии:
    17
    Один исходный файл, распарсенный на странички - этот метод в зебрум лайт, не зря они его так. Технически ничего не мешает перед заливкой множество текстовиков обьединять в один файл перед заливкой.
    Правда тогда поменяется логика создания навигации (до этого думал через класс dir генерировать менюшку).
    Зайду с самого начала:
    до сотни текстов с нч-сч запросами в названии, которые автоматом по совпадениям из этих текстов на соответствующие страницы будут линковаться.
    Как добавил пару новых текстов- на них по их запросам сразу же ссылки проставились, и из них на существующие страницы- соответственно.
    Фактически зебрум и почти удовлетворяет, кроме перелинковки по анкорам, потому и затеял самописку.
     
  8. venetu

    venetu

    Регистр.:
    28 мар 2007
    Сообщения:
    735
    Симпатии:
    261
    Если общий размер файла - до пяти мегабайт, то и проще, и быстрее весь контент держать в одном файле. Я специально тестил.

    Да, у нас фактически при каждом обращении к сайту в память ложится ВЕСЬ его контент, да еще и не один раз :) Но по тестам это оказывается намного быстрее, чем тянуть из базы. Такие вот пироги..

    Если размер файла больше 5 метров - то все равно работает, просто на таких объемах скорость уже становится сравнима с wordpress. А примерно начиная с 15 мегов все валится с Memory Allocation Error (если самому вручную не увеличивать память в php.ini, но я предполагаю все для стандартных настроек хостинга). 15 мегов контента, у вас много таких сайтов?
     
  9. Ewsen

    Ewsen

    Регистр.:
    26 июл 2008
    Сообщения:
    163
    Симпатии:
    59
    Есть готовое решение CMS Rumba XML. Все страницы в одном xml файле, либо тайтлы в xml, а тексты в отдельных файлах в каталоге /bigtext.

    И перелинковку такую поддерживает. Редактируете файл listlinks.txt и все.
     
  10. 4erepaha13

    4erepaha13

    Регистр.:
    20 июн 2009
    Сообщения:
    155
    Симпатии:
    17
    да, румба подоходит для этой цели, плюс есть возможность создания хтмл копии сайта для народа и прочих хостингов
     
Статус темы:
Закрыта.