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

Форум Apache

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

 

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

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

тема: И снова mod_rewrite !
 
 автор: Fighter   (28.09.2005 в 12:05)   письмо автору
 
 

Привет всем..
Объясните пожалуйста темному человеку как работает mod_rewrite как правильно прописывать все команды... Я почитал на этом форуме но так и не понял что к чему..
создал файл .htaccess в котором такие строки :

RewriteEngine on
Options +FollowSymlinks
RewriteBase dir/
RewriteRule ^(.*)/(.*)\.html$ index.php?page=$1

путь к сайту в ссылке такой : 127.0.0.1/dir/index.php?page=news
В httpd.conf раскоментировал строку
LoadModule rewrite_module modules/mod_rewrite.so

но преобразование URL не происходит подскажите что не так !

Или все наобарот т.е. в скрипте писать ссылку типа 127.0.0.1/dir/news
а .htaccess должен перебрасывать на 127.0.0.1/dir/index.php?page=news ???
Объясните пожалуйста !

Заранее благодарен !

   
 
 автор: glsv (Дизайнер)   (30.09.2005 в 05:38)   письмо автору
 
   для: Fighter   (28.09.2005 в 12:05)
 

>Или все наобарот т.е. в скрипте писать ссылку типа 127.0.0.1/dir/news
а .htaccess должен перебрасывать на 127.0.0.1/dir/index.php?page=news ???

Да, в скрипте, в адресной строке должна быть ссылка 127.0.0.1/dir/news, а уже mod_rewrite должен преобразовывать ее к реально-существующему пути. Хотя в адресной строке адрес не изменится (останется 127.0.0.1/dir/news), т.к. преобразование происходит незаметно для пользователей.

Под вашу задачу подойдут следующие директивы .htaccess

RewriteEngine on
Options +FollowSymlinks
RewriteBase /
RewriteRule ^([^/]*)/?$ index.php?page=$1

Это файл должен лежать в директории dir
URL-ы в строке браузера
http://127.0.0.1/dir/news/
http://27.0.0.1/dir/news
Будут преобразовываться к реальному адресу
http://127.0.0.1/dir/index.php?page=news

   
 
 автор: Fighter   (30.09.2005 в 08:59)   письмо автору
 
   для: glsv (Дизайнер)   (30.09.2005 в 05:38)
 

Спасибо большое за разъяснение, правда у меня все равно не работает, может что то в Httpd.conf не так.. Какие строки должны быть раскоментированы для работы mod_rewrite я только 1 раскоментировал LoadModule... Может еще что нибудь прописать надо ?
И еще вопрос что означает строка вида

RewriteRule ^([^/]*)/?$ index.php?page=$1

с это я вроде разобрался - RewriteRule ^(.*)dir/(.*)$ index.php?page=$2
как я понимаю она делит УРЛ до dir/ в переменную $1 а после dir в переменную $2.

А как читать ту строчку ?

   
 
 автор: glsv (Дизайнер)   (01.10.2005 в 06:06)   письмо автору
 
   для: Fighter   (30.09.2005 в 08:59)
 

А htaccess точно лежит в директории dir, а не выше ее?
А настройка Apache через htaccess у вас разрешена? Проверить это просто: напишите абракадабру в .htaccess – если сервер выдал ошибку, то все нормально - .htaccess работает.

Чтобы включить работу с .htaccess в httpd.conf нужно приписать директиву

AllowOverride All



RewriteRule ^([^/]*)/?$ index.php?page=$1

[^/] – любой символ кроме слеша /
Чтобы не проходили URL вида

http://127.0.0.1/dir/news/ааа/eee/index.html
 

* говорит, что этот символ (любой кроме слеша) может повторяться 0 или более раз
/? – говорит о том, что может быть закрывающий слеш, а может его и не быть. Последнее – чтобы правильно обрабатывались варианты:

http://127.0.0.1/dir/news/
http://27.0.0.1/dir/news


>с это я вроде разобрался - RewriteRule ^(.*)dir/(.*)$ index.php?page=$2
>как я понимаю она делит УРЛ до dir/ в переменную $1 а после dir в переменную $2.
Да, но только если .htaccess лежит выше директории dir
А если htaccess лежит в самой директории dir, то на вход этому модулю приходит не полный URL, а только его часть, находящаяся после dir/. Поэтому искать dir в уже не следует.

   
 
 автор: Fighter   (03.10.2005 в 09:23)   письмо автору
34.3 Кб
 
   для: glsv (Дизайнер)   (01.10.2005 в 06:06)
 

Спасибо за ответ, только все равно не работает :((
.htaccess лежит точно в дирриктории dir.. Пробовал писать абрукадабру :) сервер выдал ошибку.. значит все работает :)
Пишу такую ссылку http://127.0.0.1/dir/news и ничего не происходит появляется ошибка 404.
Прикрепляю на всякий случай файл httpd.conf

И вот еще лог mod_rewriter после 1 запуска страницы http://127.0.0.1/dir/kurs

127.0.0.1 - - [03/Oct/2005:10:07:10 +0400] [127.0.0.1/sid#23bc38][rid#476e88/initial] (3) [per-dir C:/www/www1/dir/] strip per-dir prefix: C:/www/www1/dir/kurs -> kurs
127.0.0.1 - - [03/Oct/2005:10:07:10 +0400] [127.0.0.1/sid#23bc38][rid#476e88/initial] (3) [per-dir C:/www/www1/dir/] applying pattern '^([^/]*)/?$' to uri 'kurs'
127.0.0.1 - - [03/Oct/2005:10:07:10 +0400] [127.0.0.1/sid#23bc38][rid#476e88/initial] (2) [per-dir C:/www/www1/dir/] rewrite kurs -> index.php?page=kurs
127.0.0.1 - - [03/Oct/2005:10:07:10 +0400] [127.0.0.1/sid#23bc38][rid#476e88/initial] (3) split uri=index.php?page=kurs -> uri=index.php, args=page=kurs
127.0.0.1 - - [03/Oct/2005:10:07:10 +0400] [127.0.0.1/sid#23bc38][rid#476e88/initial] (3) [per-dir C:/www/www1/dir/] add per-dir prefix: index.php -> C:/www/www1/dir/index.php
127.0.0.1 - - [03/Oct/2005:10:07:10 +0400] [127.0.0.1/sid#23bc38][rid#476e88/initial] (2) [per-dir C:/www/www1/dir/] trying to replace prefix C:/www/www1/dir/ with /
127.0.0.1 - - [03/Oct/2005:10:07:10 +0400] [127.0.0.1/sid#23bc38][rid#476e88/initial] (5) strip matching prefix: C:/www/www1/dir/index.php -> index.php
127.0.0.1 - - [03/Oct/2005:10:07:10 +0400] [127.0.0.1/sid#23bc38][rid#476e88/initial] (4) add subst prefix: index.php -> /index.php
127.0.0.1 - - [03/Oct/2005:10:07:10 +0400] [127.0.0.1/sid#23bc38][rid#476e88/initial] (1) [per-dir C:/www/www1/dir/] internal redirect with /index.php [INTERNAL REDIRECT]

   
 
 автор: glsv (Дизайнер)   (04.10.2005 в 04:50)   письмо автору
 
   для: Fighter   (03.10.2005 в 09:23)
 

Да, у меня точно такие же логи.
Ага, видимо, вот где ошибка. При таких директивах вызывается файл index.php из корневой директории.
Нужно поменять

RewriteBase /
На
RewriteBase /dir

Тогда будет открываться index.php, лежащий в директории dir

   
 
 автор: Fighter   (04.10.2005 в 09:22)   письмо автору
 
   для: glsv (Дизайнер)   (04.10.2005 в 04:50)
 

:) я так уже пробовал все равно не работает.. вот лог

127.0.0.1 - - [04/Oct/2005:09:19:27 +0400] [127.0.0.1/sid#23bc38][rid#482eb8/initial] (3) [per-dir C:/www/www1/dir/] strip per-dir prefix: C:/www/www1/dir/glavnaya -> glavnaya
127.0.0.1 - - [04/Oct/2005:09:19:27 +0400] [127.0.0.1/sid#23bc38][rid#482eb8/initial] (3) [per-dir C:/www/www1/dir/] applying pattern '^([^/]*)/?$' to uri 'glavnaya'
127.0.0.1 - - [04/Oct/2005:09:19:27 +0400] [127.0.0.1/sid#23bc38][rid#482eb8/initial] (2) [per-dir C:/www/www1/dir/] rewrite glavnaya -> index.php?page=glavnaya
127.0.0.1 - - [04/Oct/2005:09:19:27 +0400] [127.0.0.1/sid#23bc38][rid#482eb8/initial] (3) split uri=index.php?page=glavnaya -> uri=index.php, args=page=glavnaya
127.0.0.1 - - [04/Oct/2005:09:19:27 +0400] [127.0.0.1/sid#23bc38][rid#482eb8/initial] (3) [per-dir C:/www/www1/dir/] add per-dir prefix: index.php -> C:/www/www1/dir/index.php
127.0.0.1 - - [04/Oct/2005:09:19:27 +0400] [127.0.0.1/sid#23bc38][rid#482eb8/initial] (2) [per-dir C:/www/www1/dir/] trying to replace prefix C:/www/www1/dir/ with /dir
127.0.0.1 - - [04/Oct/2005:09:19:27 +0400] [127.0.0.1/sid#23bc38][rid#482eb8/initial] (5) strip matching prefix: C:/www/www1/dir/index.php -> index.php
127.0.0.1 - - [04/Oct/2005:09:19:27 +0400] [127.0.0.1/sid#23bc38][rid#482eb8/initial] (4) add subst prefix: index.php -> /dir/index.php
127.0.0.1 - - [04/Oct/2005:09:19:27 +0400] [127.0.0.1/sid#23bc38][rid#482eb8/initial] (1) [per-dir C:/www/www1/dir/] internal redirect with /dir/index.php [INTERNAL REDIRECT]
127.0.0.1 - - [04/Oct/2005:09:19:27 +0400] [127.0.0.1/sid#23bc38][rid#480a88/initial/redir#1] (3) [per-dir C:/www/www1/dir/] strip per-dir prefix: C:/www/www1/dir/index.php -> index.php
127.0.0.1 - - [04/Oct/2005:09:19:27 +0400] [127.0.0.1/sid#23bc38][rid#480a88/initial/redir#1] (3) [per-dir C:/www/www1/dir/] applying pattern '^([^/]*)/?$' to uri 'index.php'
127.0.0.1 - - [04/Oct/2005:09:19:27 +0400] [127.0.0.1/sid#23bc38][rid#480a88/initial/redir#1] (2) [per-dir C:/www/www1/dir/] rewrite index.php -> index.php?page=index.php
127.0.0.1 - - [04/Oct/2005:09:19:27 +0400] [127.0.0.1/sid#23bc38][rid#480a88/initial/redir#1] (3) split uri=index.php?page=index.php -> uri=index.php, args=page=index.php
127.0.0.1 - - [04/Oct/2005:09:19:27 +0400] [127.0.0.1/sid#23bc38][rid#480a88/initial/redir#1] (3) [per-dir C:/www/www1/dir/] add per-dir prefix: index.php -> C:/www/www1/dir/index.php
127.0.0.1 - - [04/Oct/2005:09:19:27 +0400] [127.0.0.1/sid#23bc38][rid#480a88/initial/redir#1] (1) [per-dir C:/www/www1/dir/] initial URL equal rewritten URL: C:/www/www1/dir/index.php [IGNORING REWRITE]

И это еще не все.. на этой странице index.php есть ссылки на файлы которые можно скачать скажем 1.rar и он не скачивается из зи преобразования ссылок.. можно как нибудь написать что бы УРЛ на файл не преобразовывался ? полный его путь 127.0.0.1/dir/files/1.rar

   
 
 автор: glsv (Дизайнер)   (05.10.2005 в 05:59)   письмо автору
 
   для: Fighter   (04.10.2005 в 09:22)
 

>все равно не работает.. вот лог
А вот так?

RewriteEngine on
Options +FollowSymlinks
RewriteBase /dir
RewriteRule ^([^/\.]*)/?$ index.php?page=$1 

Проверяем, что бы в URL не было точек. Это должно исключить повторное преобразование если в URL указано имя файла, страницы.

   
 
 автор: Fighter   (05.10.2005 в 08:57)   письмо автору
 
   для: glsv (Дизайнер)   (05.10.2005 в 05:59)
 

Млин... Все равно не фига не работает :(((

127.0.0.1 - - [05/Oct/2005:08:56:32 +0400] [127.0.0.1/sid#23bd28][rid#47af70/initial] (3) [per-dir C:/www/www1/dir/] strip per-dir prefix: C:/www/www1/dir/ob -> ob
127.0.0.1 - - [05/Oct/2005:08:56:32 +0400] [127.0.0.1/sid#23bd28][rid#47af70/initial] (3) [per-dir C:/www/www1/dir/] applying pattern '^([^/\.]*)/?$' to uri 'ob'
127.0.0.1 - - [05/Oct/2005:08:56:32 +0400] [127.0.0.1/sid#23bd28][rid#47af70/initial] (2) [per-dir C:/www/www1/dir/] rewrite ob -> index.php?page=ob
127.0.0.1 - - [05/Oct/2005:08:56:32 +0400] [127.0.0.1/sid#23bd28][rid#47af70/initial] (3) split uri=index.php?page=ob -> uri=index.php, args=page=ob
127.0.0.1 - - [05/Oct/2005:08:56:32 +0400] [127.0.0.1/sid#23bd28][rid#47af70/initial] (3) [per-dir C:/www/www1/dir/] add per-dir prefix: index.php -> C:/www/www1/dir/index.php
127.0.0.1 - - [05/Oct/2005:08:56:32 +0400] [127.0.0.1/sid#23bd28][rid#47af70/initial] (2) [per-dir C:/www/www1/dir/] trying to replace prefix C:/www/www1/dir/ with /dir
127.0.0.1 - - [05/Oct/2005:08:56:32 +0400] [127.0.0.1/sid#23bd28][rid#47af70/initial] (5) strip matching prefix: C:/www/www1/dir/index.php -> index.php
127.0.0.1 - - [05/Oct/2005:08:56:32 +0400] [127.0.0.1/sid#23bd28][rid#47af70/initial] (4) add subst prefix: index.php -> /dir/index.php
127.0.0.1 - - [05/Oct/2005:08:56:32 +0400] [127.0.0.1/sid#23bd28][rid#47af70/initial] (1) [per-dir C:/www/www1/sgu/] internal redirect with /dir/index.php [INTERNAL REDIRECT]

Зачем он повторно преобразовывает ?? :(

   
 
 автор: кен   (06.10.2005 в 17:12)   письмо автору
 
   для: Fighter   (05.10.2005 в 08:57)
 

(прошу прощения, ошибся. Сообщение не в кассу - прошу модератора его удалить.)

   
 
 автор: Fighter   (07.10.2005 в 10:58)   письмо автору
 
   для: кен   (06.10.2005 в 17:12)
 

Неужели никто ничего не подскажет :(

   
 
 автор: кен   (07.10.2005 в 13:57)   письмо автору
 
   для: Fighter   (07.10.2005 в 10:58)
 

Попробуйте задать список разрешённых символов. Например, так:
RewriteRule ^([a-z0-9_-]*)/?$ 1.php?page=$1

Разрешаются цифры, строчные латинские буквы, подчёркивание и дефис. Если нужно, можно добавить туда и другие символы.

   
 
 автор: glsv (Дизайнер)   (08.10.2005 в 07:03)   письмо автору
 
   для: Fighter   (05.10.2005 в 08:57)
 

Хм… еще раз перепроверил. У меня эти директивы отрабатывают правильно.
И у Вас вроде бы должны

internal redirect with /dir/index.php [INTERNAL REDIRECT]

Вызывается /dir/index.php

>скажем 1.rar и он не скачивается из зи преобразования ссылок.. можно как нибудь
> написать что бы УРЛ на файл не преобразовывался ? полный его путь
> 127.0.0.1/dir/files/1.rar

Преобразовывайте эти URL отдельным правилом. Можно привязаться к имени папки files. У меня заработало со следующим правилом.

RewriteRule (.*)files/(.*) files/$2

   
 
 автор: Fighter   (10.10.2005 в 08:44)   письмо автору
 
   для: glsv (Дизайнер)   (08.10.2005 в 07:03)
 

Дизайнер, огромное спасибо, все работает !

   
 
 автор: Иван   (28.10.2005 в 22:36)   письмо автору
 
   для: Fighter   (10.10.2005 в 08:44)
 

Пытаюсь превратить ссылки такого вида

http://localhost/catalog/index.php?cat=4

на такие

http://localhost/catalog/cat_4.html


RewriteEngine on
Options +FollowSymlinks
RewriteBase /
RewriteRule ^cat_(.*)([0-9]+)\.html$ $1catalog/index.php?cat=$2


всё работает как надо, единственное только если переменная cat= будет превышать одной цифры то страница не найдена

т.е в место цифры "4" будет стоять "35" то почемуто страница становиться не найденой

пытался изменить в _(.*)([0-9]+)
+ на *, тоесть неограниченное количество цифр, так тоже ничего не происходило

   
 
 автор: glsv (Дизайнер)   (29.10.2005 в 18:31)   письмо автору
 
   для: Иван   (28.10.2005 в 22:36)
 

Вот так заработало

RewriteEngine on
Options +FollowSymlinks
RewriteBase /
RewriteRule ^cat_([0-9]*)\.html$ catalog/index.php?cat=$1

.htaccess лежит в директории catalog

   
 
 автор: hate   (07.11.2005 в 21:59)   письмо автору
 
   для: Fighter   (28.09.2005 в 12:05)
 

Прошу прощения конечно, но прочетав десятки форумов не нашел решения проблеммы
Есть файл news.php в корневой
надо перенаправить
news.php?id=id
на, допустим
news/news_id/

RewriteRule ^(.*)news/news_(.*) /news.htm?id=$2

id не GET'ается... пути до кортинок(картинки в папке img) и style.css тоже меняются, и бяка получается хотя сам скрипт грузится.. помогите плиз

   
 
 автор: glsv (Дизайнер)   (08.11.2005 в 01:11)   письмо автору
 
   для: hate   (07.11.2005 в 21:59)
 

Не понятна проблема.
По вашим словам все нормально...
> пути до кортинок(картинки в папке img) и style.css тоже меняются
> сам скрипт грузится

>id не GET'ается
Это значит, что при преобразовании Rewrite теряется значение id?

Проверил Ваши директивы у себя. Параметр id передается.
Правда я подредактировал немного

RewriteRule ^(.*)news/news_([^/]*) /index.php?id=$2

Иначе в параметр заносится значение id вместе с закрывающим слешем.

PS: Под новые вопросы лучше создавать новые темы.

   
 
 автор: hate   (08.11.2005 в 07:24)   письмо автору
 
   для: glsv (Дизайнер)   (08.11.2005 в 01:11)
 

Действительно, на сервере работает всё кроме того, что
пути до кортинок(картинки в папке img) и style.css тоже меняются!!
Можете сами посмотреть
http://www.saiting.ru/news/news_7/


RewriteRule ^(.*)news/news_([^/]*) /news2.htm?id=$2

   
 
 автор: glsv (Дизайнер)   (08.11.2005 в 22:59)   письмо автору
 
   для: hate   (08.11.2005 в 07:24)
 

Вот так можно обработать изображения из папки images. Со стилями аналогично.

RewriteRule ^(.*)news/news_\d+/images(.*) /images$2 
RewriteRule ^(.*)news/news_([^/]*) /index.php?id=$2

   
Rambler's Top100
вверх

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