WebScript.Ru
C:\   главная  ::   о сайте  ::  каталог скриптов  ::  гнездо  ::  форум  ::   авторам  :: Новостройки ::   ХОСТИНГ  ::

|| разделы::
|| поиск по сайту::

|| реклама::
|| новости почтой::
Рассылки Subscribe.Ru ::



Новости сайта WebScript.Ru
Популярные статьи

Hot 5 Stories

|| рекомендуем::




ЧПУ и PHP


Прислал: Дмитрий Смирнов [ 27.10.2000 @ 11:21 ]
Раздел:: [ Статьи по PHP ]


"Spectator, кстати... а вот ссылки типа //spectator.novocybersk.ru/issues/160 это мне нравится, ОЧЕНЬ ;))) Напиши в следующей заметке, поподробнее, КАК ты это сделал ? ОК ?"
- такой отзыв пришел на предыдущую заметку - я впервые сделал на "Спектаторе" ЧПУ, начиная именно со 160 заметки. Итак, расскажу про ЧПУ и PHP. Если вы не знаете PHP, и не знаете, какие иногда страшные УРЛы бывают в результате его работы - дальше можно не читать. :)

ЧПУ - это термин, придуманный командой НовоКиберска, обозначает он "Человекопонятный УРЛ". В принципе, ничего нового и оригинального в идее понятного УРЛа нет. Про это писал и Лебедев, и другие дизайнеры. Вообще, мне всегда нравились ЧПУ на таких сайтах, как, например, CGI-Resources или Softseek.

В общем, когда я перевел "Спектатора" на PHP, начались наезды на, мол, адреса у тебя не совсем удобны. Для тех, кто не знает, заметка 161 имела (бы) такой УРЛ: //spectator.novocybersk.ru/index.php3?161. Теперь имеет такой: //spectator.novocybersk.ru/issues/161. Вроде бы, стало лучше. Как это делается?.. Рассказываю по просьбам читателей, ботающих на Php.

Вообще, самая первая мысль - это создавать для каждой заметки поддиректорию с соответствующим номером в директории issues и помещать в нее index.html, то есть сделать так, чтобы по адресу //spectator.novocybersk.ru/issues/161 лежал бы реальный файл. Разумеется, так дело не пойдет ;(

Вторая идея - прописать в фале .htaccess страницу, которая будет выдаваться при ошибке 404.

То есть:

------------------------------------

ErrorDocument 404 /index.php3

ErrorDocument 401 /index.php3

------------------------------------

Грубо говоря, пользователь набирает //spectator.novocybersk.ru/issues/161, такая страница не найдена, и загружается файл index.php3. Дальше - все просто. Переменная $REQUEST_URI дает нам адрес вызываемой страницы (в данном случае это будет /issues/161), вывести на экран соответствующий файл - дело техники.

Ан нет. Хорошая идея, а не работает. IE ни в какую не хочет показывать то, что надо, а вместо этого пихает свою стандартную страницу "404" с кучей текста. Тут я и остановился. Не то, чтобы застрял, просто лень было копать дальше.

А на самом деле решалось все просто. Надо, чтобы страница, которая грузится в случае ошибки 404, изменяла бы код ошибки и сигналила, мол, мужик, все ОК, есть такая страница: <?php header("http2/1.0 200 Ok"); ?>

Итого: прописываем в .htaccess страницу, которая, собственно, за все отвечает (у меня это index.php3). В этой странице пишем php-скрипт, который работает с $REQUEST_URI, шлет заголовок "http2/1.0 200 Ok" и отображает то, что надо.

Пример:

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

$num=$REQUEST_URI;

$num = eregi_replace ( "/issues/", "", $num );

include ($num.".txt"); ?>

P.s. Вот еще один способ сделать это по-другому, а вот еще один.
---------------------------------
Дмитрий Смирнов
Spectator


 :::::  Ali пишет 27.10.2000 @ 11:37 
 :::::  Spectator пишет 27.10.2000 @ 15:13 
Нет, по идее ЧПУ - это когда в адресе нет НИЧЕГО лишнего для тупого юзера ;) Средний человек не понимает, что такое \"?id=\"
 :::::  Sergey Vladykin пишет 31.10.2000 @ 15:38 
Маленькое соображение. Не станет ли применение этого способа последней каплей для индексирующих роботов? Яndex твой сайт нормально воспринимает ?
 :::::  Spectator пишет 31.10.2000 @ 16:04 
Как ни странно, но вполне нормально. Я проверял.
 :::::  RosT пишет 04.11.2000 @ 13:38 
А на CGI или Perl такое можно сделать? Если кто знает, то пишите на e-mail
 :::::  Aloner пишет 16.02.2001 @ 01:02 
Ребята, зачем заниматься ерундой и изобретать велосипед? :)

Mod_rewrite для Апача придуман дааавно...
Тем более каждый 404 будет валится в лог Апача, что не есть хорошо (хотя это зависит от настройки Апача).
Пишем в .htaccess :

RewriteEngine on
RewriteRule issues/(.+)/ issue.php?id=$1

и ложим этот .htaccess в корневой каталог например. Mod_rewrite должен быть включен.

И все - все запросы на /issues/num/ будут прозрачно сервером трансформироваться в issue.php?id=num

С приветом,
Aloner
 :::::  Андрей пишет 01.07.2001 @ 05:38 
А можно немного поподробнее насчет RewriteEngine? Мне апач (дома под Вин стоит) сказал что у него ошибка в конфигурации.
 :::::  Виктор пишет 19.07.2001 @ 02:47 
Маленькое наблюдение:
пробую таким способом создать навигацию по сайту: делаю ссылки на несуществующие каталоги, а потом в скрипте разбираю - что же сделать.
При этом хотя вызывается скрипт из корневого каталога, текущим становится несуществующий каталог. Можно ли оставить текущим корневой каталог?

И по поводу Mod_rewrite:
под Win98 он не хочет работать - говорит:
Options FollowSymLinks or SymLinksIfOwnerMatch is off which implies that RewriteRule directive is forbidden
а включение этой опции в VirtualHost ничего не меняет. Как сделать этот модуль рабочим под Win?
 :::::  Alesh пишет 13.03.2002 @ 13:48 
Я б так сделал
<? php header("http/1.0 200 Ok");
$num=$REQUEST_URI;
$num = eregi_replace ("/read/","", $num );
$file=$num.".txt";
if (file_exists($file))
{
include $num.".txt";
}
else {
print "404 не найдено";
} ?>

 :::::  SergeiKo пишет 28.03.2002 @ 01:22 
А я долго мучался и сделал вот как
смотрите: http://b2b.nsys.by - оригинал

http://b2b.nsys.by/html/b2b.nsys.by/ - обработчик.

А как? А просто - стоит телепорт, который по расписанию автоматом грабит нужной конфигурации скрипт и складывает на сервак ;)

Быстро, и сервак не подгружает и вообще мне понравилось.
 :::::  NoFate пишет 15.10.2002 @ 12:15 
Я вот тока прочитал статью и уж было хотел написать о том, что мощьность сервера Апач неиспользуют, как тут уже это появилось :(( Только вот Автор забыл, что нуна указывать опции(по крайней мере на моём апаче такое не воспринимается).

Что касается апача виндового, то смотрите конфиг
Прежде всего должен быть доступен mod_rewrite через LoadModule. Ну а далее надо сказать апачу где выхотите, что бы mod_rewrite мог быть доступен в конфиге или в .htaccess. Т.е. вам надо в правиле RewriteOptions .htaccess|virtual host|directory|server config.

Судя по вашим ошибкам вы пытаетесь написать RewriteEngine on в VirtualHost, НО...
НО САМОЕ ГЛАВНОЕ УПУСКАЕТЕ!!!!
Просто в конфиге апача укажите RewriteOptions virtualHost и УСЁ!!!!
 :::::  Alexey пишет 25.10.2002 @ 03:20 
Единственная проблема способа описанного в этой статье, это то, что скрипту нормальным образом ничего через форму не пошлешь.
 :::::  Mike пишет 08.11.2002 @ 06:03 
NoFate, ты забыл добавить в начале: "... зайдите в гости в хостеру, поставьте ему коньяк, попросите поправить конфиг Апача под _ваши_ нужды, переспросите куда идти и, собственно, идите..." :)
 :::::  Лев пишет 20.12.2002 @ 15:02 
Тема ЧПУ очень интересна в смысле привлечения посетителей с поисковиков - так как например РАМБЛЕР не индексирует странички с адресом http://www.webscript.ru/stories.php?id=52 но втоже время свободно индексирует странички с адресом типа http://www.webscript.ru/stories/52
Одно обидно - error.log Apach'a
 :::::  Vaxa пишет 28.01.2003 @ 13:00 
А можно ли отключить логгирование именно этой ошибки?
В примере, написанном выше, а именно
===============================
<? php header("http/1.0 200 Ok");
$num=$REQUEST_URI;
$num = eregi_replace ("/read/","", $num );
$file=$num.".txt";
if (file_exists($file))
{
include $num.".txt";
}
else {
print "404 не найдено";
} ?>
===============================
можно ли сделать с помощью хтаксесса так, чтобы запись о 404 ошибке появлялась в логах сервера только в случае последнего элса?
 :::::  Solid пишет 13.02.2003 @ 12:17 
 :::::  NoFate пишет 01.10.2004 @ 22:25 
2 Mike:
А у них это подключенино...
 :::::  Петр пишет 03.07.2007 @ 08:19 
Все время будет вызываться ошибка 404, это во-первых нелогично и некрасиво, а во вторых, очень вскоро логи ошибок на сервере переполнят все свободное прастранство на диске.
Я бы предложил немного другой подход:
в файле .htaccess поместить только (ну если больше ничег оне надо, кодировку, язык локали)
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule .* /index.php
В этом случае всегда будет вызываться index.php
Имя:
Email:
URL

Введите сумму двух чисел девять и шесть (девять+шесть=?)
Запомнить мою информацию

* Html запрещен* Ваш E-mail опубликован не будет.

Copyright © 2000-2001 WebScript.Ru nas@webscript.ru
Design © 2001 by Parallax Design Studio (aka Spectator.ru)
Все торговые марки и авторские права на эту страницу принадлежат их соответствующим владельцам.
Сгенерировано за: 0.0555909