Иной

ЧПУ и PHP

ЧПУ - это термин,
придуманный командой НовоКиберска,
обозначает он
"Человекопонятный УРЛ".

Термин нигде широко не употреблялся,
пока о нём не написали заметку "ЧПУ и PHP" 5 сентября 2000 года.

За эти время термин довольно неплохо раскрутился (см. поисковик).

Итак!
В принципе, ничего нового и оригинального в идее понятного УРЛа нет.

Вообще, мне всегда нравились УРЛы такого вида, например:
http://domain.tld/dir1/page1/

Итак, как это сделать в домашних условиях?

Способ[1]:
Вообще, самая первая мысль - это создавать для каждой заметки поддиректорию с соответствующим именем и помещать в нее index.html, то есть сделать так, чтобы по адресу http://domain.tld/dir1/page1/ лежал бы реальный файл.
[+]: Нет.
[-]: Разумеется, так дело не пойдет.
Думаем дальше...

Способ[2]:
Раз страница не существует, то она выдает 404.
Так что вторая идея - прописать в .htaccess страницу, которая будет выдаваться при ошибке 404,
а уже эта страница будет смотреть на текущий УРЛ и выдавать нужный документ.
То есть, в .htaccess пишем:

ErrorDocument 404 /index.php

ErrorDocument 401 /index.php

Пользователь набирает, такая страница не найдена, и загружается файл index.php

Дальше - все просто.
Переменная $_SERVER['REQUEST_URI'] даёт нам адрес вызываемой страницы (в данном случае это будет /dir1/dir2/page1),
вывести на экран соответствующий документ...

Этого мало.
В некоторых браузерах и с поисковиками такой фокус не пройдет:
страница 404 будет выдавать соответствующий код, и страницы индексироваться не будут.
Поэтому надо, чтобы страница, которая грузится в случае ошибки 404, изменяла бы код ошибки и сигналила, мол, все ОК, есть такая страница:

<?php header('HTTP/1.0 200 Ok'); ?>

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

[+]: Очень простой способ.
Работает почти везде.
[-]: При таком способе нельзя постить содержимое формы на несуществующие псевдоурлы.
И если в Апаче ведется лог 404-ых ошибок, то он будет забит.

Способ[3]:
Для этих (и не только) целей есть специальный модуль в Апаче, который называется mod_rewrite.
Он позволяет "переписывывать урлы", то есть, преобразовывать их "на лету" по правилам, которые вы ему опишите.

Это очень мощный модуль, и если вы в нем разберетесь, то сможете творить чудеса.

Напишите в .htaccess:
#Включить модуль:
RewriteEngine On
#Базовый путь:
RewriteBase /
#Существующие файлы и папки:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
#Обработка путей:
RewriteRule .* index.php
и в index.php используйте $_SERVER['REQUEST_URI'] и preg_split("/(\/|\..*$)/",$uri,PREGSPLIT_NO_EMPTY);
или
RewriteRule (.+)/(.+) index.php?a=$2&b=$1
где $1 - это первое условие в скобках, передающаяся на переменную $_GET['b'] для каждого запроса.

Читайте документацию, благо, что ее полно:

http://httpd.apache.org/docs/mod/mod_rewrite.html - Module mod_rewrite URL Rewriting Engine
http://www.engelschall.com/pw/apache/rewriteguide - A Users Guide to URL Rewriting with the Apache Webserver
http://www.egoroff.spb.ru/portfolio/apache/mod_rewrite.html - Модуль Apache mod_rewrite
http://sitemaker.ru/technologies/webserver/mod_rewrite - Mod_rewrite для чайников

[+]: Очень мощный способ.
[-]: Может не хватить мозгов.
На хостинге может быть не установлен этот модуль.

Способ[4]:
Основан на директиве FilesMatch, которая в Апаче является core feature.
Все просто.
Пишем опять же в .htaccess:

Action throw /index.php

<FilesMatch "^([^.]+)$">
ForceType throw
</FilesMatch>

<FilesMatch index.php>
ForceType application/x-httpd-php
</FilesMatch>

После этого все УРЛы, которые подпадают под условие "^([^.]+)$",
(то есть все урлы, в которых не содержится точка) будут передаваться на index.php.
Вы можете написать свое условие, разумеется.

[+]: Простой и удобный способ.
[-]: Для того, чтобы ForceType работал, php должен быть подключен к апачу в виде модуля.

Если php вызывается,
как обыкновенный CGI - ForceType работать не будет.

(c) 14.09.2003 http://spectator.ru/tehnology/php/user_friendly_urls
Мобильная подписка ИЗИ ИВИ:
промокод easytad на 30 дней бесплатно
+ продление за 99 руб.