Проблема с генерацией страниц

Тема в разделе "Mod Rewrite / htaccess / ЧПУ", создана пользователем stev, 17 сен 2008.

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

    stev

    Регистр.:
    23 окт 2007
    Сообщения:
    175
    Симпатии:
    12
    Пишу динамический дорген с квази-кэшированием (т.е. если при обращении пользователя страницы нет на сервере, то запрос с помощью mod_rewrite перенаправляется на генератор и страница генерируется в виде html, а также сохраняется на сервере).

    .htaccess
    PHP:
    RewriteEngine On 
    RewriteCond 
    %{REQUEST_FILENAME} -[OR] 
    RewriteCond %{REQUEST_FILENAME} -[OR] 
    RewriteCond %{REQUEST_FILENAME} -
    RewriteRule 
    ^.*$ - [NC,L
    RewriteRule ^.*$ /pagegen.php [NC,L]
    pagegen.php
    PHP:
    <?

    //Определяем кейворд из адреса. Если генерим индексную страницу - выбираем кейворд каким-либо другим способом на твоё усмотрение
    if( preg_match('#/?([^/]+)\.html$#' $_SERVER['REQUEST_URI'],$parts) )
    {    
        
    $name $parts[1];    
        
    $filename $name.'.html';    
        
    $keyword str_replace("-"," ",$name);
    }      
    else if (
    $_SERVER['REQUEST_URI']=="" || $_SERVER['REQUEST_URI']=="/")
    {    
        echo(
    'INDEX PAGE');
        
    $filename "index.html";    
        
    $keyword "INDEX KEYWORD";
    }

    //Генерим текст страницы
    $text 'Страница про '.$keyword.'';

    //Сохраняем файл
    file_put_contents($filename,$text);

    include (
    $filename);

    ?>
    Все нормально работает, кроме генерации index.html при запросе вида Перейти по ссылке Подскажите в чем косяк? Почему не обрабатывается это условие:
    PHP:
    else if ($_SERVER['REQUEST_URI']=="" || $_SERVER['REQUEST_URI']=="/")
    ??

    Жду Ваших комментариев.
     
  2. venetu

    venetu

    Регистр.:
    28 мар 2007
    Сообщения:
    737
    Симпатии:
    263
    Скорее всего у тебя косяк в mod_rewrite - оно просто не перекидывает на нужную страницу.

    А не перекидывает оно потому, что пустой урл - это и есть папка htdocs, а она существует, следовательно условие %{REQUEST_FILENAME} -d
    выполняется, следовательно рерайт не запускается.

    Добавь в .htaccess в начале

    RewriteRule ^$ /index.html [NC]

    чтоб оно все запросы на / редиректило на /index.html, а там уже и второй RewriteRule подхватится..
     
    stev нравится это.
  3. stev

    stev

    Регистр.:
    23 окт 2007
    Сообщения:
    175
    Симпатии:
    12
    Спасибо! Заработало, но при обращении к index.html происходит его постоянная перезапись. Это конечно мелочь, но хотелось бы придерживаться поставленной цели:
    запрос, генерация файла, еще запрос, открытие ранее сгенерированного файла.

    Как еще можно реализовать данный алгоритм без перезаписи?

    Вроде бы разобрался :ah:
    Добавить нужно такую строку
    RewriteRule ^$ /index.html [NC,L]
     
  4. fpinger

    fpinger

    Регистр.:
    11 май 2007
    Сообщения:
    253
    Симпатии:
    58
    А не проще ли всегда направлять на скрипт, который определяет наличие сгенерированной страницы и либо отдаёт её, либо генерирует и отдаёт?
     
  5. venetu

    venetu

    Регистр.:
    28 мар 2007
    Сообщения:
    737
    Симпатии:
    263
    Не проще, потому что пустой процесс с php отжирает минимум 300кб памяти, а делов ему - только проверить что файл есть и выплюнуть его в stdout.

    В идеале конечно и апач такими замороками не нагружать, но это уже слишком много возни, nginx ставить, настраивать.. А так - в модрерайт прописал и привет, апач раздает статику напрямую, не плодя лишних процессов.

    Добавлено через 38 секунд
    Еще и с докачечкой :)
     
  6. fpinger

    fpinger

    Регистр.:
    11 май 2007
    Сообщения:
    253
    Симпатии:
    58
    Оптимизация раньше времени является злом.
     
  7. venetu

    venetu

    Регистр.:
    28 мар 2007
    Сообщения:
    737
    Симпатии:
    263
    Так это не "оптимизация раньше времени". Это вообще не оптимизация.

    Это скрипт на php из трех строчек, против других трех строчек в .htaccess

    Два решения одной проблемы. Оба пути приведут к желаемому результату. Оба примерно равны по усилиям. Но при этом один заметно тормознутее другого. "Так зачем платить больше?" (с)
     
Статус темы:
Закрыта.