mod_rewrite. Создание ЧПУ

InviS

Новичок
mod_rewrite. Создание ЧПУ

Подскажите, пожалуйста, уже второй день бьюсь с создание ссылок "как вконтакте" и не получается... Вот что мне нужно:
У меня на сайте есть ссылки вида:
Код:
index.php?t=diagnostic
Это нужно заменить на подобие каталога diagnostic, чтобы пользователь в браузере вводил
Код:
http://mysite.ru/diagnostic
и попадал на
Код:
http://mysite.ru/index.php?t=diagnostic
Максимум, что у меня получилось:
Код:
RewriteEngine On
RewriteRule ^/img/(.*)$ - [L]
RewriteRule ^([^/]*)\.html$ /index.php?t=$1 [L]
Без .html у меня не получилось... ;( Подскажите в чем ошибка
 

tz-lom

Продвинутый новичок
в .htaccess
Код:
RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ entrypoint.php [L,QSA]
в точке входа:

PHP:
$uri = substr($_SERVER['REQUEST_URI'],0,strpos($_SERVER['REQUEST_URI'],'?'));
 

Вурдалак

Продвинутый новичок
InviS, можешь оставить свой вариант, но добавь эти условия:
Код:
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
 

iceman

говнокодер
> Без .html у меня не получилось... ;( Подскажите в чем ошибка

RewriteRule ^([^/]+)$ /index.php?t=$1 [L]
 

InviS

Новичок
Автор оригинала: Вурдалак
InviS, можешь оставить свой вариант, но добавь эти условия:
Код:
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
Спасибо! помогло! вот только теперь мне не понятен еще один мегабок! У меня плывут картинки и CSS оформление... каждый раз новая папка и путь недоступен...

И еще мне не понятен момент... что если я хочу проделать такое не с одним уровнем вложенности? Что, если у меня есть ссылка типа:
Код:
index.php?t=edit&year=2008&month=9&day=7
и мне нужно
Код:
 /2008/9/7
я думаю, что надо сделать что-то типа:
Код:
RewriteRule ^([^/]*)/?([^/]*)/?([^/]*)/?([^/]*)/?$ /admin/index.php?t=$1&year=$2&month=$3&day=$4 [L]
Вроде так должно сработать, НО что делать с CSS оформлением? и с картинками? Они же все не будут фактически лежать в папке 2009
P.S. Все пути к CSS и картинкам - относительные. Т.е.
Код:
<link rel='shortcut icon' href='img/favicon.ico' />
<link rel='stylesheet' href='css/reset.css' type='text/css' media='screen' />
<link rel='stylesheet' href='css/style.css' type='text/css' media='screen' />
 

Духовность™

Продвинутый новичок
Вроде так должно сработать, НО что делать с CSS оформлением? и с картинками? Они же все не будут фактически лежать в папке 2009
P.S. Все пути к CSS и картинкам - относительные. Т.е.
пропиши их как путь от корня - /css/....

http://phpfaq.ru/paths


я думаю, что надо сделать что-то типа
да. поэтому, как тебе уже сказали, mod_rewrite лучше не использовать в классическом его исполнении для ЧПУ. Лучше ВСЕ виртуальные адреса перенаправлять в один единый скрипт на PHP, а уже там его парсить регулярными выражениями и подключать соответствующие модули.
 

InviS

Новичок
Автор оригинала: triumvirat
пропиши их как путь от корня - /css/....

http://phpfaq.ru/paths



да. поэтому, как тебе уже сказали, mod_rewrite лучше не использовать в классическом его исполнении для ЧПУ. Лучше ВСЕ виртуальные адреса перенаправлять в один единый скрипт на PHP, а уже там его парсить регулярными выражениями и подключать соответствующие модули.
Я не много не понял, что мне предложили... да и сейчас не пойму, что значил тот прикол с entrypoint.php и как им правильно пользоваться... Я в общих чертах понимаю, что это круто, но....
Вот что я сделал у себя...
Код:
RewriteEngine On  
RewriteCond %{REQUEST_FILENAME} !-d  
RewriteCond %{REQUEST_FILENAME} !-f  
RewriteRule ^(.*)$ entrypoint.php [L,QSA]
А в entrypoint.php я написал:
PHP:
<?
  $uri = substr($_SERVER['REQUEST_URI'],0,strpos($_SERVER['REQUEST_URI'],'?')); 
  echo $uri;
?>
И что бы я не ввел в строку запроса... ничего не происходит. Выводится чистая страница.... Помогите разобраться, пожалуйста!
 

InviS

Новичок
Вурдалак
))) так я этот код передрал у автора постом выше))) приняв его за чистую монету. Сейчас глянем!

-~{}~ 13.09.10 09:23:

Вурдалак
Объясни мне, пожалуйста, что должно происходить внутри php-кода entrypoint.php. А я уже сам организую это. Я не пойму, что та строчка с strpos и substr делает и для чего она нужна!


P.S. Я кажется въехал зачем entrypoint.php нужен... Мы должны разобрать ссылку и определить что именно у нас запрашивают в данный момент. Вот, что я набросал:
PHP:
<?
	session_start();
	$uri = explode("/",substr($_SERVER['REQUEST_URI'],1,strlen($_SERVER['REQUEST_URI'])));
	$get=array("t"=>$uri[0]);
	switch ($uri[0]){
		case "struct"	:	{$get["id"]=$uri[1]; break;}
	}
	//	моя ссылка: index.php?t=$uri[0]&$second=$uri[1]
	$_GET=$get;
	require_once("index.php");
?>
Все четко... НО! Я должен везде писать не относительные пути, а полные? выходит так? Т.е. если я везде писал
Код:
<img src='img/123.jpg' />
то все перестанет работать? То же самое и со стилями. У меня везде они прописаны примерно так:
Код:
<link rel='stylesheet' href='css/reset.css' type='text/css' media='screen' />
Если я адресую следующую ссылку:
Код:
mysite.ru/ru/1989/9/18/
то браузер будет искать мои CSS файлы в
Код:
mysite.ru/ru/1989/9/18/css
Подскажите, как это побороть??

P.S.S. Нашел решение:
Код:
<base href='http://$_SERVER[HTTP_HOST]/' />
Подскажите, есть ли подводные камни в таком вот решении?
 

Духовность™

Продвинутый новичок
Объясни мне, пожалуйста, что должно происходить внутри php-кода entrypoint.php. А я уже сам организую это.
ВСЕ виртуальные запросы при использовании

Код:
RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ entrypoint.php [L,QSA]
находятся в файле entrypoint.php (лучше его назвать index.php). Они доступны в переменной $_SERVER['REQUEST_URI'].

Теперь с помощью средств PHP ты можешь выдрать из $_SERVER['REQUEST_URI'] имя подключаемого файла, а так же имена переменных.

Все делают это по разному. Некоторые составляют набор правил в формате регулярных выражений, типа твоего
Код:
^([^/]*)/?([^/]*)/?([^/]*)/?([^/]*)/?$
и последовательно перебирают эти правила в попытке сопоставить их с текущим URI запросом. Другие реализуют схему, когда ЧПУ представлен как /модуль/действие/переменная1/значение1/переменная2/значение2/..
 

tenshi

Новичок
лучше делать урлы с вопросиком:

mysite.ru/?ru/1989/9/18/

тогда и модреврайт не нужен и относительные урлы нормально работают
 

Духовность™

Продвинутый новичок
зачем делать с вопросиком, если можно тремя строчками сделать без вопросиков?

Да и не ЧПУ это уже. Не опрятно как-то.
 

Фанат

oncle terrible
Команда форума
triumvirat
ни в каких.
тем более при использовании ЧПУ.
а зачем позволяет - так сложилось исторически.
 

tenshi

Новичок
triumvirat вопросики человеконепонятны? х) то, что ты называешь чпу - это псевдостатика. ни роботам, ни человекам от неё ни тепло, ни холодно.
 

Фанат

oncle terrible
Команда форума
tenshi
не знаю, как про людей
но вот гуглю ты расскажи про вопросики, когда он тебе в качестве адреса ссылающейся страницы укажет /
 
Сверху