Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум Apache

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Снова Человеко-понятные URL - mod_rewrite
 
 автор: kramolnic   (26.01.2007 в 01:24)   письмо автору
 
 

Наткнулся в Инете на одну CMS.
В ней сайт представлен в виде древовидной структуры. Можно добавлять корневые и поддокументы. Например: Информация - о нас, продукция, обратная связь и т.п...
Однако хочется знать, как система делает ЧПУ?
скажем, добавили мы в раздел Новости подразделы Футбол, Компьютеры, Кино. CMS сама сгенерирует такие ссылки:
news/fubol/...
news/computery/
news/kino/
Насколько я понял, все это делается через .htaccess Но, как я понял, прописывать подмену надо вручную.. тут же система делает это автоматически. Получается, скрипт лезет в файл .htaccess и прописывает все, что нужно? тогда что туда следует записать? чтобы, например, из этого:
index.php?module=news&group=futbol$id=1
получилось это: /news/futbol/1

Заранее благодарен за ссылки и особенно за хорошие примеры.

   
 
 автор: Sergey89   (26.01.2007 в 01:38)   письмо автору
 
   для: kramolnic   (26.01.2007 в 01:24)
 

На своем сайте использую подобную технологию. Необходимо весь URI передавать в одной GET переменой и обрабатывать её уже в скрипте.

   
 
 автор: kramolnic   (26.01.2007 в 03:54)   письмо автору
 
   для: Sergey89   (26.01.2007 в 01:38)
 

А можно подробнее? вообще ничего не понял. это так что ли? index.php?n=news/futbol/1
а потом парсить переданный в переменной URL? если да, то я имел в виду немного другое.
Мне надо вместо передачи скрипту news.php переменных group и id, т.е. вместо такого адреса: www.mysite.ru/index.php?module=news&group=football или www.mysite.ru/index.php?module=news&group=football&id=1 сделать нормально читаемые URL на файлы, которых в принципе нет, т.е: www.mysite.ru/news/football и www.mysite.ru/news/football/1 соответственно. Т.е. физически все URL на сайте будут указывать на один реальный Файл Index.php. В зависимости от первого "уровня" (в данном примере news) этот index.php должен подключить соотвествующий файл модуля (в данном примере - модуль новостей), а уже он будет решать, что выводить, на основании остальной части строки (какой раздел новостей, какую именно новость и т.п).
При всем этом необходимо, чтобы нормально работали формы с POST методом отправки данных!

   
 
 автор: Loki   (26.01.2007 в 09:23)   письмо автору
 
   для: kramolnic   (26.01.2007 в 03:54)
 

в htaccess находится регулярное выражение, которое разбирает url на части и передает скрипту в качестве get параметров.

   
 
 автор: Sergey89   (26.01.2007 в 13:48)   письмо автору
 
   для: kramolnic   (26.01.2007 в 03:54)
 

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^\.]*)$ index.php?p=$1 [L]


http://site/1/2/3/4/5

<?php
$act 
explode('/'$_GET['p']);
print_r($act);
?>

   
 
 автор: kramolnic   (09.02.2007 в 19:32)   письмо автору
 
   для: Sergey89   (26.01.2007 в 13:48)
 

А как быть с передачей GET-параметров?
Запрошенный URL у меня оказывается здесь: $_GET['p']. А куда деваются переданные пользователем параметры?
допустим, адрес выглядит так:
http://site/1/2/3/4/5/?page=10&id=10 Где будут содержаться GET-параметры?

И как исправить .htaccess, чтобы такие адреса: http://site/1/2/3/4/5/file.htm (и с другими расширениями тоже) нормально воспринимались? А то сервер отвечает, что страница не найдена.

htaccess я уже исправил.... а вот как принимать GET параметры мне не ясно до сих пор. На форуме пишут, что строка параметров хранится в QUERY_STRING, однако туда у меня выводится только лишь строка, переданная в параметре p:
http://site/1/2/3/4/5/?page=10&id=10 - В QS будет: p=1/2/3/4/5/ Но это меня не устраивает, т.к. не будут нормально работать формы с GET методом отправки.

   
 
 автор: glsv (Дизайнер)   (10.02.2007 в 07:39)   письмо автору
 
   для: kramolnic   (09.02.2007 в 19:32)
 

>А куда деваются переданные пользователем параметры?
Для их передачи нужно использовать переменную %{QUERY_STRING}
Попробуйте такой вариант:

RewriteEngine on  
Options +FollowSymlinks  
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_URI} !index.php
RewriteRule ^(.*)$ index.php?p=$1&query=%{QUERY_STRING} [L]

Для URL http://mysite.ru/1/2/3/4/test.html?id=434

[p] => 1/2/3/4/test.html
[query] => id=434

   
 
 автор: kramolnic   (10.02.2007 в 19:48)   письмо автору
 
   для: glsv (Дизайнер)   (10.02.2007 в 07:39)
 

Большое спасибо за код, наконец-то заработало как надо. Однако вот это сервер принимать не хочет (выкидывает 500 ошибку):

RewriteEngine on   
Options +FollowSymlinks   
RewriteBase / 
RewriteCond %{REQUEST_FILENAME} !-f  
RewriteCond %{REQUEST_FILENAME} !-d  
RewriteCond %{REQUEST_URI} !index.php 
RewriteRule ^(.*)$ index.php?p=$1&query=%{QUERY_STRING} [L] 


Я написал в .htaccess такой вариант:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^\.]*(?:[a-z0-9]+\.(htm|html)){0,1})$ index.php?cms_url=$1&%{QUERY_STRING} [L]


Работает с виду как надо. Но насколько это корректно? Для чего служат эти строки:

Options +FollowSymlinks   
RewriteBase / 


И что изменилось, когда я их убрал?

   
 
 автор: glsv (Дизайнер)   (11.02.2007 в 08:07)   письмо автору
 
   для: kramolnic   (10.02.2007 в 19:48)
 


Options +FollowSymlinks  

Включает символические ссылки. Без этой опции mod_rewrite не работает. А так, как у Вас работает, то это значит, что опция включена по умолчанию и переопределять ее запрещено (отсюда 500 ошибка).

RewriteBase / 

RewriteBase определяется относительно какой директории mod_rewrite будут осуществлять преобразования. Здесь от корня - /

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования