|
|
|
| Наткнулся в Инете на одну CMS.
В ней сайт представлен в виде древовидной структуры. Можно добавлять корневые и поддокументы. Например: Информация - о нас, продукция, обратная связь и т.п...
Однако хочется знать, как система делает ЧПУ?
скажем, добавили мы в раздел Новости подразделы Футбол, Компьютеры, Кино. CMS сама сгенерирует такие ссылки:
news/fubol/...
news/computery/
news/kino/
Насколько я понял, все это делается через .htaccess Но, как я понял, прописывать подмену надо вручную.. тут же система делает это автоматически. Получается, скрипт лезет в файл .htaccess и прописывает все, что нужно? тогда что туда следует записать? чтобы, например, из этого:
index.php?module=news&group=futbol$id=1
получилось это: /news/futbol/1
Заранее благодарен за ссылки и особенно за хорошие примеры. | |
|
|
|
|
|
|
|
для: kramolnic
(26.01.2007 в 01:24)
| | На своем сайте использую подобную технологию. Необходимо весь URI передавать в одной GET переменой и обрабатывать её уже в скрипте. | |
|
|
|
|
|
|
|
для: 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 методом отправки данных! | |
|
|
|
|
|
|
|
для: kramolnic
(26.01.2007 в 03:54)
| | в htaccess находится регулярное выражение, которое разбирает url на части и передает скрипту в качестве get параметров. | |
|
|
|
|
|
|
|
для: 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);
?>
|
| |
|
|
|
|
|
|
|
для: 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 методом отправки. | |
|
|
|
|
|
|
|
для: 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
|
| |
|
|
|
|
|
|
|
для: 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 /
|
И что изменилось, когда я их убрал? | |
|
|
|
|
|
|
|
для: kramolnic
(10.02.2007 в 19:48)
| |
Включает символические ссылки. Без этой опции mod_rewrite не работает. А так, как у Вас работает, то это значит, что опция включена по умолчанию и переопределять ее запрещено (отсюда 500 ошибка).
RewriteBase определяется относительно какой директории mod_rewrite будут осуществлять преобразования. Здесь от корня - / | |
|
|
|