Check out the Latest Articles:
Когда mod_rewrite бессилен

Сегодня все привыкли к приянтному на глаз формату URL (человеко понятным урлам).

Большинство разработчиков поступают просто:

создают шаблон в htaccess файле для mod_rewrite модуля apache и все работает.

Но что делать, если шаблон URLа может изменятся (например, сайт может отлично работать в режиме: http://site.com/page, но при этом, для поддержки языков, должен работать и в формате: http://site.com/ru/page, при этом показывая те же данные).

Или другой пример: разные страницы сайта обрабатываются разными скриптами, при этом количество фактических параметров, полученных через строку браузера у скриптов разное (http://site.com/?page=index&id=12 и http://site.com/?page=photos&album=2&p_id=12&…)

В таких случаях mod_rewrite бессилен, там как он способен обрабатывать запросы одинаковые по количесвту параметров.

Что же делать в этом случае?

Для этого есть отличное решение:

  1. В файле htacces в корне сайта устанавливаем редирект всех запросов на один файл php (index.php, например)
  2. В файле index.php настраиваем обработку строки запроса.

Получается что-то вроде своего собственного mod_rewrite, заточенного под собственные требования.

htaccess


RewriteEngine On
#Подкулючаем модуль mod_rewrite

RewriteCond %{SCRIPT_FILENAME} !-f
#Отключаем редирект запросов, если запрос идет к существующему файлу

RewriteCond %{SCRIPT_FILENAME} !-d
#Отключаем редирект запросов, если запрос идет к существующей папке

RewriteRule ^(.*)$ index.php/$1
#Переводим все запросы на index.php

php


<?php

$url= $_SERVER['REQUEST_URI'];  //Получаем полную строку запроса к сайту

$urla=explode('/',$url);  //Разбиваем строку на параметры

print_r($urla);  //Выводим на экран (временно)

?>

Теперь у нас есть массив всех параметров, которые пришли на сайт от посетителя. То есть теперь мы можем вызвать скрипт вывода на экран данных, передав в него массив параметров.

Допустим 1-й параметр — это название раздела сайта (новости/фотогалерея/форум). А параметры после первого (их точное количество нам не известно) используются уже непосредственно модулями, выполняющими вывод новостей или фотографий или форума.

Тогда по 1-му параметру мы определям модуль, который должен начать работу, и передаем ему массив параметров, которые он уже самостоятельно обрабатывает.

Например:

Входящая строка: http://site.com/news/21/12/2008/

Получили в файле index.php:


['news','21','12','2008']

Проверяем какой модуль вызвать:


if ($urla[0]=='news')

$mod_news->show($urla);

и передаем в него параметры.

Все. Задача выполнена. Сайт может получать любое количество параметров.

Также по теме:

  1. Топ-3 бесплатных сервисов тестирования отображения сайта Проблема тестирования правильного отображения сайта в разных браузерах, в разных...


This website uses IntenseDebate comments, but they are not currently loaded because either your browser doesn't support JavaScript, or they didn't load fast enough.


  1. Poollinkka on Пятница 10, 2009

    За такие посты надо награды давать, на полном серьезе!

  2. Sashuulllkaa on Пятница 10, 2009

    Информативно,продолжай в том же духе

  3. ziinnkka on Пятница 10, 2009

    Отлично написано. Позитива конечно не хватает, но читал на одном дыхании

  4. Maariisaa on Пятница 10, 2009

    Спасибо за статью оказалась очень полезной.

  5. odessa on Пятница 10, 2009

    Вопрос от чайника
    А не будут ПС рассмативать такой метод как 301 или 302 ошибку? Ркдиректо вроде как не приветствуется

    • ekwo on Пятница 10, 2009

      Нет. На самом деле радиректа там нет. Все данные просто подгружаются через один файл. Для ПС они кажутся физическими.

  6. Olegreze on Пятница 10, 2009

    Основная задача Яндекса — давать ответы на вопросы пользователей!

  7. Седдор on Пятница 10, 2009

    Впечатлило, однако!


You must be logged in to post a comment.