Профессиональная разработка Web-приложений.  
Боишься нашего дизайна?
Новости
PDF журнал
Участники проектa
Сотрудничество
Ссылки
Карта сайта
Комментарии
Комментарии к статье
Добавить комментарий
Обсудить на форуме
Информация об авторе
Оценка статьи

Имитация файлов и директорий

Базовый способ работы с интуитивно-понятными адресами через обработку 404-й ошибки.

Имитация файлов и директорий

Адрес вашего сайта появляется на пользовательском экране одновременно с дизайном и контентом. Поэтому адрес является полноправной частью сайта. Адрес типа www.фирма.ру (www.фирма.город.ру), естественно, гораздо лучше, чем www.geocities.com/Gonduras/San-Pedrillio/~наша_фирма, кто спорит. А вот по вопросу понятных человеку адресов внутри сайта общественность четкого консенсуса пока не нашла.

Однако пользователю приятнее было бы видеть адрес типа /services/special/ чем /content.phtml?q=e23908a234cc239b3445127.

Лирическое отступление. Помню, на Интернити-99 мне показали флэш-ролик Hewllett Packard Laser Jet 3100. Через пару недель я вспомнил про него и решил скачать его из дома. Я бы долго бродил в бесполезных поисках по сайту Лексмарк (чего вы смеетесь, это так и было!), если бы не их адреса. На HP адреса были понятные — что-то вроде "/products/printers/laserjet/3100", а на сайте Лексмарка было вот именно это непонятное "q=492898748273". Я был в сомнениях, но через день вспомнил-таки, что это был HP :).

Кстати, на этом сайте адреса выпусков, версий для печати и всех информационных страниц (ссылки, файлы и т.д.) виртуальные, файлов с такими названиями не существует.

Делается это достаточно просто. В файле .htaccess пишутся строчки, например

ErrorDocument 404 all.php
ErrorDocument 403 all.php
ErrorDocument 401 all.php

Файл all.php обрабатывает переменную $REQUEST_URI и, если нужная информация найдена, выдет команду

header ("HTTP/1.0 200 Ok");

Это необходимо для того, чтобы броузер IE 4 считал, что страница найдена, а не подставлял вместо нее свою служебную вывеску "адрес не найден". В остальных случаях, даже если запрошен адрес "all.php", пользователю будет выдаваться сообщение о том, что файл не найден.

Если при вызове функции header сервер ругается матом "Error 500" - смотрите здесь и здесь.

Конечно же, выдать заголовок и нарисовать страницу — нехитрое дело. Отслеживание результатов запросов, проверка на ошибки — это скорее рутина. Самое ответственное дело — разбор запрашиваемого адреса.

Тут приемов много. Например, у меня версия для печати и страница отзывов ищутся по регулярным выражениям:

if (preg_match("/(d+)-comment/A", $url, $res)) ...

А потом из переменной $res[0] беру номер выпуска и проверяю наличие его в базе. Адрес из нескольких поддиректорий можно, например, при помощи взрыва :)

$dir = explode("/", $url);

и потом обрабатывать подстроки по одной (перед взрывом надо убрать из начала и конца строки слэши).

Кстати, перед тем, как писать материал, я честно отправил письмо на info@lenta.ru с вопросом, используется ли у них такой метод обработки запроса или там действительно существуют директории. Мне не ответили. Не буду гадать, как у них сделано, напишу, как бы я делал обработку адреса.

if (preg_match("/([a-z]+)/(d{4})/(d{2})/(d{2})/([a-z]+)/A", $url, $match)) {
  $request = "SELECT news_id FROM news, rub WHERE news.rub_id=rub.rub_id AND rub_address='". $match[1]. "' AND news_date LIKE '". $match[2]. "-". $match[3]. "-". $match[4]. "' AND news_address='". $match[5]. "'";

Этот запрос делается просто для проверки, есть ли такая новость в базе. А потом в зависимости от результата выдается либо страница с новостью, либо какая-нибудь ругань (или главная страница рубрики/сайта).

А вот как я проверяю адреса на этом сайте:

if (preg_match("/(d+)-print/A", $url, $res)) {
  // версия для печати
  }
elseif (preg_match("/(d+)-comment/A", $url, $res)) {
  // все отзывы
  }
elseif (!preg_match("/D/", $url)) {
  // полная версия выпуска
  }
else {
  // либо остальные рубрики, либо адрес не найден
  };

Кстати, у себя я как честный человек выдаю header("HTTP/1.0 200 Ok") только если выпуск/рубрика найдены.

И еще один пример. Допустим, рубрики сайта построены как дерево, а таблица в базе выглядит так:

CREATE TABLE rubrika (
   id TINYINT NOT NULL AUTO_INCREMENT,
   parent_id TINYINT,
   address VARCHAR(16) NOT NULL,
   title VARCHAR(128) NOT NULL,
   rub_text TEXT NOT NULL,
   PRIMARY KEY (id),
   UNIQUE address (address)
);

Что такое title и rub_text — объяснять не надо. Поле address — это адрес, по которому будет запрашиваться рубрика (новости нужно сделать рубрикой первого уровня, и в поле address будет "news"). Поле parent_id — идентификатор рубрики уровнем выше.

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

$url = $REQUEST_URI;

// убираем слэши из начала и конца адреса
$url = ereg_replace("^/", "", $url);
$url = ereg_replace("/$", "", $url);
$dir = explode("/", $url)

// случай, когда запрошена рубрика второго уровня.
if (sizeof($dir)==2) {

// составляется запрос, объединяющий таблицу rubrika саму с собой. 
//Здесь надо заметить только, что таблица first подразумевает рубрику второго уровня, 
//а second, наоборот, первого.
  $request = "SELECT first.id, first.title, first.rub_text FROM 
    rubrika first, rubrika second WHERE 
    first.parent_id=second.id AND first.address='". $dir[1]. "' AND 
    second.address='". $dir[0]. "'";

// Отправляем запрос в базу, а потом обрабатываем результат.
  $result = mysql_query($request);

  if (!mysql_error() && @mysql_num_rows($result)==1) {

    }

// Это на случай, если запрос прошел успешно, но ничего не найдено
  elseif (!mysql_error()) {

    }

// ...и на случай, если произошла ошибка.
  else
    die ("Ошибка БД. MySQL пишет: ". mysql_error());
  }

// Запрошена рубрика первого уровня. тут и делать-то нечего :)
elseif (!ereg("/", $url)) {
  $request = "SELECT id, title, rub_text FROM rubrika WHERE address='$url'";
  ...
  };

Хватит примеров? Дальше — дело фантазии. Подведем итоги, распишем положительные и отрицательные моменты.

Плюсы
  • Красивые адреса, возможность зайти в рубрику, набрав ее адрес на клавиатуре. Благодарность от фанатов клавиатуры.
  • Уменьшение количества файлов, уменьшение количества повторяющихся операций в разных файлах.
  • Централизация вывода. Сбор большинства операций в единой точке входа.
  • Скрытие некоторой технологической части сайта.
Минусы
  • Увеличение ресурсоемкости за счет проверки адреса и компиляции большого файла вместо нескольких маленьких.
  • Сложность с введением новых параметров (я, можно сказать, удачно вывернулся с версией для печати, но было бы более логично видеть адреса типа /13/print). Кое-что придется сбрасывать, например в куки.
  • Кое-что, например, поиск, так и останется вне "точки входа" (хотя... "How IT works" делает поиск в адресе, но для более-менее сложного сайта это будет неудобно или невозможно).
  • Дополнительные сложности с адресами картинок и навигации по сайту (броузер-то мерит все адреса относительно открытого документа, пусть даже из несуществующего адреса).

Напоследок: в этом выпуске я использовал кучу регулярных выражений, поэтому (и по просьбам читателей) обещаю в скором времени затронуть эту тему.

Имитация файлов и директорий. Часть 2

В прошлом выпуске я описал работу с ЧПУ ("человекопонятные УРЛы") через ошибку #404. Сам пользуюсь именно этой схемой. Но через день после публикации материала свой отзыв написал Константин Шевченко (aka cat) и предложил мне рассказать публике о других способах работы с адресами на сайте. Он же меня и консультировал.

В отзывы, так же написали, что это серьезно грузит систему. Да, грузит. И я об этом честно написал. И еще одна поправка: диалог в отзывах
Посетитель: А интересно, что скажут поисковики на етот мнимый ErrorDocument?
Я: Поисковики считают такие адреса нормальными — они делят всё на 200 Ok и 404 Not Found. А остальное им по барабану.

Поисковики, конечно же, не делят все на 200 и 404. Они знают и другие коды сервера, просто никто не может проверить на уровне программ, существует ли документ, который прислал сервер или нет. Если код 200, значит существует и доступен. И ничего более.

Потом Юра Буров написал по поводу предыдуего материала в "Еженедельках". Однако, это не все, что можно написать, как думает он.

Одна вещь, которую забыл описать в предыдущем выпуске — виртуальный файловый архив. Через ErrorDocument вполне возможно отслеживать запросы к несуществующей директории download и выдавать запрошенные файлы из базы, а администратор сайта мог бы работать с этим архивом через веб-форму. Чтобы правильно выдавать тип файла (content-type), нужно брать его тогда, когда его закачивает администратор. В таблице файлов сделать дополнительное поле, в котором хранить эти типы, и выдавать их в заголовке. Разумеется, произойдет снижение производительности сервера.

А теперь о том, что описал Костя. Перечислю способы по возрастанию сложности (порядок, впрочем, спорный).

Сервер ищет файл с тем же именем

Оказывается, достаточно прописать в установках директории (httpd.conf или .htaccess) строку Options Multiviews или, если директива Options уже есть, добавить MultiViews к ней. Тогда если пользователь набирает "<адрес директории>/foo/bar", сервер будет искать файл с именем "foo" и с любым расширением. Найденный с наибольшим совпадением (вот это для меня загадка) файл он обработает с его типом mime, то есть если есть news.php, а набран адрес news/, то сервер отдаст адрес на обработку php. Если это картинка, то сервер отдаст ее броузеру именно как картинку (послав соотвествующий заголовок content-type). А в news.php разбираем $REQUEST_URI. Например, если новости выводятся целой лентой, либо за определенную дату, разбор можно сделать таким:

/* Первый вариант — когда набран адрес типа "/news/010120", возможно с дробью на конце. 
//Символы ^ и $ здесь обозначают привязку к началу и концу строки. Подстрока [0-9]{6} 
//означает 6 цифр (если у вас новости могут быть датированы 1999-м годом и раньше, 
//используйте адреса с полным форматом года и 8 цифр вместо 6). */
if (ereg("^/news/([0-9]{6})$", $REQUEST_URI, $match) || 
	ereg("^/news/([0-9]{6})/$", $REQUEST_URI, $match)) {

  }

/* второй вариант — набран адрес просто "/news" или "/news/" */
elseif (ereg("^/news/$", $REQUEST_URI) || ereg("^/news$", $REQUEST_URI)) {

  }

/* запросы ко всем остальным адресам (в этом файле) считаются попытками взлома сайта */
else
  die ("Error 404 Not found");

То же самое можно сделать, например, с каталогом продукции фирмы — вынести все это дело в отдельный файл catalogue.php, а адреса сделать вида "/catalogue/rubrik1/rubrik2/rubrik3". При этом в файле catalogue.php начало строки будет откусываться, а дальше можно обработать по принципу, описанному в предыдущем выпуске. Остальное же можно отправить, опять же, в ErrorDocument.

Сервер разбирает запрос

Метод похожий, но на вскидку менее ресурсоемкий, потому что не приходится искать файлы по директории.

В установках директории (опять же httpd.conf или .htaccess) пишем:

<FilesMatch "^(news)$">
ForceType application/x-httpd-php
</FilesMatch>

В директории лежит файл с именем "news" (именно "news", без расширения). Когда запрашивается адрес "/news", либо "/news/bla-bla-bla", сервер выполняет файл news как php-скрипт. А внутри него производится обработка переменной $REQUEST_URI.

Чтобы не писать для каждого подобного файла свой блок FilesMatch, нужно немного изменить строку шаблона. Пусть сервер ищет файлы без расширения, то есть те, у которых в имени нет точки:

<FilesMatch "^([^\.]+)$">

Очень удобно! Когда-нибудь поставлю такое же и себе.

Сервер переписывает запросы

Очень полезная вещь mod_rewrite. Ею можно сделать все вышеописанное, и много другого.

К сожалению, моя битва с mod_rewrite не увенчалась успехом (Костя пишет, что нижеописанного достаточно для работы Rewrite Engine под Unix. У меня под win98 — ни в какую...). Поэтому описываю очевидные вещи и то, что описал Костя.

Для начала надо раскомментировать строку

LoadModule mod_rewrite <путь к модулю/имя файла>

в httpd.conf. В конфигурации директории пишем строку "RewriteEngine On". Затем — команду RewriteRule: RewriteRule <шаблон> <замена>

Например RewriteRule ^(.*).html$ /otherdir/$1.html (все без кавычек). Вот, собственно, и все. Все, что я так и не смог проверить : Я спросил у ясеня, я спросил у тополя, я спросил у форума... форум не ответил мне. (мелодично) Я спрошу у публики... На всякий случай, спрашиваю у уважаемой публики: как запустить Rewrite Engine под win98 se + apache/1.3.14 + php/4.0.4-Antonio (установлен как модуль) ?

А пока еще один пример (опять же от Шевченко):

RewriteEngine On
RewriteRule   ^(.*).htm$  /portal/$1

<FilesMatch "(portal)$">
ForceType application/x-httpd-php
</FilesMatch>

Там лежит один файл с именем "portal", в который перенаправляются все запросы к html-файлам в данной директории. И получается, как будто там лежат файлы.

Напоследок вспомним Ленту.ру.

Вот здесь, в са-а-амом конце Носик говорит про ресурсоемкость их технологии. "Издательская машинка, написанная Максимом Евгеньевичем Мошковым, (который библиотека) интересна тем, что она весит около 60Kb"

Не знаю, что из себя представляет эта система (скорее всего, скомнилированный ), гадать не буду. Мне хотелось бы прикинуть, как динамическую адресацию можно реаизовать через php. Впрочем, тут не в нем дело — был бы Апач. Итак, схема адресов <рубрика>/<год>/<месяц>/<день>/<новость>. Если отрезать имя новости, получим материалы рубрики за день. Если отрезать день, месяц и год, получим последние материалы рубрики.

RewriteRule ^([a-z]+)/$ rubika_last/$1
RewriteRule ^([a-z]+)/([0-9]{4})/([0-9]{2})/([0-9]{2})/$ rubrika_date/$1/$2-$3-$4
RewriteRule ^([a-z]+)/([0-9]{4})/([0-9]{2})/([0-9]{2})/([a-z]+)/$ rubrika_news/$1/$2-$3-$4/$5

<FilesMatch "^rubrika">
ForceType application/x-httpd-php
</FilesMatch>

Преимущества этого метода по сравнению с единой точкой входа EerrorDocument очевидны: движок php интерпретирует только то, что будет выполняться. Никаких switch/case или if/elseif/else, никаких лишних строк.

Все остальное — отдаем ErrorDocument "как в предыдущей задаче".

Ccылки по теме
  • Боремся за чистоту адресов
  • Jen о "человекопонятных УРЛах"


  • For comment register here
       2001-01-17 11:13
    На самом деле ты для этой статьи выбрал самый плохой способ для реализации несуществующего файла или каталога. Я имею ввиду то, что ты прописал в .htaccess
    Есть гораздо более элегантные и красивые решения. Причем не ведущие за собой непредсказуемых результатов ( типа несуществующей картинки).
    Да и как разобрать $REQUEST_URI это вообще не вопрос для обсуждения. Надо было предложить несколько вариантов написания .htaccess это было бы гораздо интереснее и было бы о чем поговорить.

    Если интересно обращайся на мыло расскажу подробнее.
    И конечно тебе не ответят на ленте ру как сделали они. Хотя большой тайны здесь нет они думают, что фантазия есть только у них :))

       Unknown 2001-01-17 12:06
    Большое спасибо! Выпуск #14 целиком и полностью твой :)

       2001-01-18 16:00
    :) А интересно, что скажут поисковики на етот мнимый ErrorDocument?
    Слышал, что для этой цели можно применить Апачевский mod_rewrite..Было бы интересно про это где-то почитать на понятном русском языке...или УРЛ..Спасибо.

       Unknown 2001-01-18 16:53
    Поисковики считают такие адреса нормальными - они делят всё на 200 Ok и 404 Not Found. А остальное им по барабану. mod_rewrite сейчас проходит у меня испытания.

       Unknown 2001-01-19 14:17
    To: bigcat@
    Ну выложи для всех твои решения...
    Чаво умничать, а то мож они не такие красивые....

       Unknown 2001-01-19 15:10
    Он мне по почте описал решения, завтра-послезавтра выложу описание.

       2001-01-19 17:46
    На мой взгляд такая метода достаточно удобна и дает красивые адреса. Но есть один неприятный момент: выдача существующего документа апачем производится гораздо быстрее, чем узнавание его адреса скриптом и последующая сборка. Посему использование ее для информационных сайтов с большим числом посетителей будет сильно грузить сервер.

       Unknown 2001-01-19 18:39
    Естественно.

       Unknown 2001-01-21 12:23
    редкостно кривой способ. есть apache, есть mod_rewrite для него - зачем изобретать велосипед?

       Unknown 2001-01-21 13:16
    Тем не менее, этот метод используют, и даже рекомендуют (<a href=http://www.spectator.ru/issues/161>;тут, например</a>). А про нормальный метод&nbsp;&#151; смотри выпуск #14.

       2001-01-21 13:45
    Можно обойтись без mod_rewrite путем указания DocumentRoot .../.../.../index.php в настройках виртуального хоста.
    А там уже можно и $REQUEST_URI разбирать.

       Unknown 2001-01-21 14:38
    Так это получается тот же ErrorDocument. Главная проблема&nbsp;&#151; жвижку надо слишком много компилировать, если все в одном месте лежит.

       2001-01-22 11:24
    Проблема такая. Прописываю в htaccess ErrorDocument 404 all.php3 и у меня по 404 ошибке перескакивает на тот файл целиком. В нем же REQUEST_URI равен all.php3 а не виртуальному пути :( Если можно сразу ответить, пишите на arauf@mail.ru -- а то проблема висит :(

       2001-01-23 15:34
    Как быть с относительными путями?
    когда делаю hrc.ru/consulting - все работает, грузится, картинки ищутся в hrc.ru/pictures, но когда набираю hrc.ru/consulting/ (а так получается если я по ссылке перехожу), то все отрабатывается похожим образом, но пути у картинок и остального строятся относительно директории consulting, которой нету, так как у меня используется этот механизм виртуальных директорий (
    Вообщем как обойти это -- не знаю. :(

       Unknown 2001-01-23 16:27
    Писать абсолютные пути. У меня&nbsp;&#151; та же проблема.

       2001-01-24 21:55
    Кто нибудь разобрался, как в методе "404" передать $QUERY_STRING?
    Ну никак у меня не получилось. а нужно. например для поиска.

       Unknown 2001-02-08 13:24
    Черным по белому написано же: header ("HTTP/1.0 200 Ok").

       2001-02-08 19:55
    аааа, делал переадресацию и на PHP файл в котором в самом
    начале было вот такое header ("HTTP/1.0 200 Ok")
    но проблема еще вот в чем, под виндой эта фича не работает,
    а пробовали тот же httpd.conf в линксе там заработало =(
    немогу понять в чем дело

       2001-02-08 21:30
    Я вот тут все еще сижу и тра*аюсь над всем этим делом.
    Попробовал я все это дело в Netscape и он умница поведал мне
    что я имею кроме Нот Фаунд еще и 500-ую ошибку связанную с ErrorDocument. Я тогда отключил хидер который посылает OK-OB :)
    И у меня на время все заработало, но ИЕ делал переадресацию на файл который я подставляю, а нетскейп все красиво как я ввел (http://127.0.0.1/go/to/news) вот этот баг мне не понравился. После этого я подумал "Если работает без хидера
    подставлю ка я .html файл" и тут все началось с начала :(
    Возвращаю все обратно и в нетскейпе работает, а в эксплорере
    нифига :( Ну что это такое и как с ним бороться???

       Unknown 2001-02-08 22:23
    Значит у тебя под линуксом php установлен как модуль (а иначе там нельзя, наверное), а под виндой - как CGI. "Отдельно стоящий" php не может посылать такие заголовки правильно. Выход&nbsp;&#151; либо поставить модуль, либо закомментировать строки с хедэрами (насколько я понимаю, под виндой ты тестируешь), а перед закачкой на сервер - раскомментировать. Остальное из того, что ты пишешь, для меня покрыто туманом&nbsp;&#151; выражайся яснее, а лучше пиши в форум.

       2001-02-14 13:12
    Хе-хе. А у експлорера есть настройка которая
    перехватвает все коды ошибок
    Show friendly HTTP error messages
    как с ней бороться? Не могу же я каждому пользователю говорить
    что вот надо зайти и выключить эту фишку и у вас будет все работать.
    Как вы от этого избавились?

       Unknown 2001-02-14 14:05
    №;%$^@! HEARED("HTTP/1.0 OK!!!");!!!

       2001-02-17 13:42
    >>Рауф

    В Вашем случае действительно легче с абсолютом, но можете почитать дальше.
    Я понял так: есть script "consulting._ext_", в нем ссылки на картинки имеют вид "pictures/имя_файла". Естественно броузеры при создании полного пути заменят текст после последнего слеша на относительный путь. Выход прост: ведите отсчет от /consulting/, т.е. "../pict_и_т_д", а в самом скрипте запретите обращение к нему без закрывающего слеша, либо добавьте в <HEAD> элемент <BASE> и измените "базу" страницы.
    Наслаждайтесь жизнью, она того стоит.(афоризм)

       Unknown 2001-02-17 14:35
    Кстати, по-моему, можно при помощи mod_rewrite ОЧЕНЬ упростить работу с картинками. Наверняка кое-кто в сети (та же Лента.ру) догадались, что это можно делать, но молчат :)

    RewriteRule pict/[^\./]+\.(gif|jpe?g|png)$ - [L]

    RewriteRule ([^\./]+)\.(gif|jpe?g|png)$ /detail/pict/$1.$2 [L]

    Дома проверил - работает, причем сервер не грузит (пока я не добавил в негативные классы слэш - картинки вообще не выдавались! и своп постепенно забивался).
    Первая строка здесь нужна, чтобы не зациклить сервер (иначе он будет бесконечно переписывать "прямые" запросы к картинкам). Параметр "[L]" заставляет прекратить дальнейшие переписывания адресов. И не надо париться с "../../" :) Пути к файлам можно писать хоть какие&nbsp;&#151; только имена чтоб совпадали! Остается только выяснить, насколько это грузит сервер. Будут смельчаки? Если что-то проверите - пишите, опубликую результаты.

       Unknown 2001-02-17 23:06
    detail: Черным по белому написано же: header ("HTTP/1.0 200 Ok").
    Это надо поставить строкой в .htaccess или куда то еще?

       Unknown 2001-02-17 23:59
    header - это функция php, значит надо писать это в скрипте-обработчике запросов.

       Unknown 2001-02-18 00:14
    Немного в вдогонку. Как я понял, необходимо создать файл на PHP, который будет печатать необходимый хеадер и загружать страничку. Многие посетители Вашего сервера не знакомы даже с основами PHP, поэтому не могли бы Вы привести самый простой пример решения довольно таки актуальной для многих проблемы обработки ошибок експлорером?

       Unknown 2001-02-18 01:07
    Это здесь же и написано! :)

       Unknown 2001-02-18 11:27
    Это правильно?

    ----- missing.html -----

    <?php header("http/1.0 200 Ok"); ?>

    <html>

    <head>

    <title>HTTP 404 - File not found</title>

    </head>

    HTTP 404 - File not found

    </body>

    </html>

    ----- missing.html -----

       Unknown 2001-02-18 12:20
    Да. Только в директории, в которой надо открывать missing.html по неправильному запросу, надо положить файл .htaccess с такой строкой:

    ErrorDocument 404 <путь от ServerRoot>missing.html

    Кстати, расширение лучше не html, а php. Тут надо выполнять php-код, а файлы .html такую обработку обычно не проходят (настройки в mime.types).

       2001-03-01 15:48
    Если PHP стоит как модуль апача, то URL типа /somepage/foo/bar не вызывает ошибок, в случае если существует файл /somepage.php (расширение в URL тоже можно пропустить). Будет вызван /somepage.php, при этом $SCRIPT_NAME будет содержать "/somepage" (не somepage.php !!), в $PATH_INFO будет /foo/bar . Дальше с этим можно делать все что заблагорассудится. Полная иллюзия каталогов и файлов.

       Unknown 2001-03-01 16:41
    Такое вроде бы пройдет, но кое у кого возникают ошибки, если вызвать одновременно MultiViews и RewriteRule.

       2001-03-07 07:21
    Спасибо тебе за помощь. Я вот по твоей статье сделал и все работает. Можно посмотреть здесь http://ezone.com.ua/news/

       Unknown 2001-03-07 08:14
    Душа радуется :)

       2001-03-21 12:41
    2eXpert: Элементарно, Ватсон! $HTTP_SERVER_VARS["REDIRECT_QUERY_STRING"]
    Парсить, увы, ручками...

       2001-03-21 14:04
    detail, а кто Вас заставляет всё это компилировать?:) all.php должен просто разобрать путь и понять, чего от него хотят. После этого делается include() того php-модуля, который отвечает за конкретный запрос и всё. Вовсе не обязательно всю функциональность упихивать в один скрипт.

       Unknown 2001-03-21 14:57
    С include просто структура кода сложнее.

       2001-03-25 18:09
    Спасибо большое за подробную полезную статью!

       2001-03-26 22:18
    Спасибо!! Так долго об этом думал, мечтал. !!! И вчера прочитал вашу статью и сделал все точь в точь. Теперь жизнь новая начинается!!! www.ukrhotel.com User friendly URL URA

       Unknown 2001-03-26 23:11
    угу :)

       2001-03-27 10:11
    Насчет - [14.02.2001 16:12] не совсем понятно. совмещать 2 headers ????

       2001-04-06 10:33
    Ну не получается заставить работать 404..=( перепробовал все. В в конфиге апача не нужно ничего прописывать ? Насчет M$ не понятно.

       Unknown 2001-04-06 11:26
    В конфиге апача ничего прописывать не надо. Всё - в .htaccess

       Unknown 2001-04-11 18:28
    Не совсем понятен совет писать в .htaccess, а не в апачевский конфиг.
    Конфиг читается только призапуске сервера, а .htaccess при каждом обращении
    к серверу - зачем сервер лишней работой грузить?

       2001-04-22 23:24
    А так не проще?? ;)))
    <location /news>
    ForceType application/x-httpd-php
    </location>
    и будет без всякого поиска файл исполняемым ;))
    By!

       2001-04-23 09:00
    Все типа правильно, но есть одно но... На access_log посмотрите, одни 404 :)

       2001-05-22 17:15
    Нашёл статью.. и мею что сказать.
    По наивности я тоже хотел сделать себе сайт на таком движке (сам изобрёл и был жутко горд).
    Увы, обломал меня подлый IE 5.5. Он отказался работать с файлом (в вашем примере all.php) в случае если этот файл имеет размер меньше 512 байт.
    Смириться с подобным траблом я не мог, бо никто не знает что ещё может выкинуть броузер.
    Так что не всё так просто.

    З.Ы. Впоследствии я узнал что изобретал собственный rewrite модуль. так что rtfm. :)

       2001-09-01 10:52
    Как развивается данная проблема?

       2001-10-01 15:46
    А так не логичнее будет?

    Options Indexes Includes MultiViews FollowSymLinks
    RewriteEngine On
    RewriteRule ^([^/]+)/([^/]+)/([^/|.]*) /index.php?cat[1]=&cat[2]=&cat[3]=&% [S]
    RewriteRule ^([^/]+)/([^/|.]*) /index.php?cat[1]=&cat[2]=&% [L]

       2001-10-13 08:01
    А как, в таком случае получать данные из формы, если она была послана методом POST?
    В какие переменные Апач засовывает эти данные?

    Пока я только разобрался, что форма присланая методом GET лежит в REDIRECTED_QUERY_STRING (вообщем-то можно и через REQUEST_URI, но это чуть сложнее).

       2001-12-11 05:43
    > Спасибо тебе за помощь. Я вот по твоей статье сделал и все работает. Можно посмотреть здесь
    > http://ezone.com.ua/news/

    Смотрим.

    Warning: Unable to jump to row 0 on MySQL result index 2 in bynews.inc on line 18
    Warning: Unable to jump to row 0 on MySQL result index 2 in bynews.inc on line 19

       Unknown 2001-12-11 06:36
    Оно там работало полгода назад, я сам видел :)

       2001-12-26 13:17
    Я с проблемкой столкнулся. И удачно решил ;) Если кто хочет пользоватся ЧПУ под апачами надо в httpd.conf параметр UseCanonicalName поставить в Off. Если он активирован то ссылки вида www.imya.ru/news некорректно обрабатываются и приходится писать www.imya.ru/news.phtml например.

       Unknown 2002-01-04 07:51
    Дмитрий, поздравляю, самая подробная статья на эту тему в рунете.

    Помогите пожалуйста, у меня стоит классический php-parser, а-ля спектатор, который считывает документы из ссылки по типу
    $filename = "txt/".$HTTP_GET_VARS["articles"] .&amp;#39;.txt&amp;#39;;
    if (file_exists ($filename)):

    $fd = fopen ($filename, "r");
    $contents = fread ($fd, filesize ($filename));
    Fclose ($fd);
    echo ($contents);

    else:
    echo ("Не нашел!");
    endif;

    ?>

    а сама ссылка на движок соответсвенно прямая- a href=parse.php?articles=10
    так вот, при попытке реализовать для считкы ссылок /articles/заметка/
    mod-rewrite

    htaccess
    RewriteEngine on
    RewriteRule articles/(.+)/ parser.php?=$1

    Парсер выводится ,но файл не считывает.

    Не могу понять, в чем проблема.
    Пробовал и с относительными, и с самыми что ни на есть безотносительными url,

    Будьте так добры, помогите освоить новую технологию.
    Спасибо.

       Unknown 2002-01-04 08:44
    По-моему, надо выдергивать номер заметки из $REQUEST_URI.

       2002-03-12 15:33
    А как закачать сайт (есть программы, качающие всю структуру сайта с относительными ссылками, как директорию), на котором используется в .htaccess ErrorDocument 404 a/error.php и все соответственно проходит через этот error.php с include(), если это можно сделать?

       2002-03-18 15:04
    А у меня на сайте работает такой рулез:
    RewriteRule !.(gif|css|jpg|png)$ /home/www/docs/index.php

    Только вот не могу заставить работать под виндами, а на слакваре все на ура.

       2002-12-05 15:25
    Пропиши в мета-тегах (хидер ХТМЛ-дока) базовый каталог.
    Можно так:
    <base href=http://<?php echo $_SERVER['HTTP_HOST']; ?>/>

       Unknown 2003-05-12 15:14
    Вот мне например любопытно, чтоже делать с POST запросами? Отказаться насовсем? :(

       Unknown 2003-07-10 14:02
    Из опыта:
    В случае с "Options Multiviews" сервер отдает заголовок "406" и сайт с такой схемой не индексируется yandex'ом, googl'ом, может и другими каталогами, больше не проверял.

       2003-07-18 21:18
    http://www.2winners.com/121007.html - самый простой пример применения mod_rewrite с подробными объяснениями - работает под виндой и никсами

       2004-01-12 20:21
    А как можено заставить выдавать сервер не код ошибки (Неверный формат ресурса (сервер вернул код ошибки 406)) а нормальний ответ??

       2004-03-27 11:16
    Так кто-нибудь разобрался с ошибкой 406?

       2004-04-05 13:10
    To user@aol.com :

    Ошибаешься - на то и нужен мод реврайт, чтобы избавляться от "?" в урле - иначе некоторые поисковики просто не индексируют такие урлы!!!

       2004-05-25 12:57
    А вот как зделал я

    RewriteEngine On
    RewriteRule ^(.*)$ index.php

    Тогда любой запрос пересилаєтса на index.php

       2005-01-26 15:50
    Я завел для рубрик в базе поле name (например это будет products или printers) и ускоритель ввиде path. Path будет выглядеть в виде /products/printers/laserjet Т.е. найти все дочерние рубрики можно запросом path like '$path%' Очень ускоряет работу.

       2005-04-05 14:37
    Проблема в том что перестали работать url поддоменов, а точнее если
    напишешь http://поддомен.сайт.com/ то выдает ошибку 404,
    а если http://поддомен.сайт.com/index.php то работает.
    Это происходит из-за тех самых строчек в .htaccess .

    DirectoryIndex index.php
    RewriteEngine On
    RewriteRule ^([^.]+)$ index.php?$1

    Я думаю это из-за физического расположения поддоменов,
    они у меня в public_html/... а не на одном уровне с
    public_html. Под денвером на компе все работало.

    Помогите, что делать....

       2005-04-12 21:12
    У меня релаизовано так:
    RewriteEngine on
    RewriteRule ^/images/(.*) /images/$1 [PT]
    RewriteRule ^/(.*) /index.php [PT]

    Где, images - все что нужно отправлять напрямую, а по всему остальному вызываеться index.php - в нем при помощи следующеих строк получаю массив пути:
    $url = preg_split ("/\//",$_SERVER['SCRIPT_URL'], 10,PREG_SPLIT_NO_EMPTY);

       2005-04-13 11:38
    ErrorDocument 404 error.php
    <FilesMatch "^([^\.]+)$">
    ForceType application/x-httpd-php
    </FilesMatch>

    Хм. Работает лишь <HOST>/news
    Вариант с набором <HOST>/news/ или <HOST>/news/add.php никак. И почему-то 404 не обрабатывается :( Может для этого годится только Линух?

       2005-04-24 16:08
    Немного не понятно, для разных категорий можно ето осуществить или как?
    Вот мой случай: у меня сайт работает всего через один файл index.php
    можно ли сделать, чтобы
    http://сайт/index.html?productID=223
    выглядел как ttp://сайт/product/223
    а http://сайт/index.html?categoryID=121 как http://сайт/category/121 ?

       2007-01-15 19:29
    для этого есть мод реврайт на апаче и зовется это &quot;ЧПУ&quot; - человеко понятный УРЛ :)

       2007-05-02 00:57
    AliasMatch ^/files/ /path/script.php
    После добавления такой строки в конфиг апача, все запросы идущие на сайт в папку files ( www.site.com/files/.....) будут обработаны скриптом script.php. Очень просто и понятно.

    Базовый способ работы с интуитивно-понятными адресами через обработку 404-й ошибки.

     
     
     
        © 1997-2008 PHPClubTeam
    []