Как правильно написать Rewrite?

gamma

Guest
Как правильно написать Rewrite?

Познакомился с mod_rewrite недавно. Решил прочитать мануэл и всякие др. статьи(Вроде понятно как он работает).
Но когда просмотрел все threadы посвешеные ему окончательно запутался(Все пишут по разному).
Задача у меня такая: переделать URL так чтоб поисковиками индексировался. И страницы были определенные.(т.е. одно правиол ко всем не подходит)
Cогласен тема избитая, обсужденная 100 раз, но есть ньюансы кот. я не могу разобрать.
(например видел такое: если меняем на /something.php?id=$1 и т. д. то указывается следом [T-application/x-httpd-php,L] другие ето не пишут.
Моя конкретная задача
например.
http://mysite/about-my/ заменяем на
http://mysite/index.php?act=ab
...
http://mysite/my-news/12-10 на
http://mysite/index.php?news=..&id=...
и т.д.
Напиал такой .htaccess
------------------------------
RewriteEngine On
RewriteBase /
Options +FollowSymlinks
RewriteRule ^/about-my/([^/]+) /index.php?act=about [L]
RewriteRule ^/my-news/([^/]+) /index.php?act=news&id=1$ [L]
т.д.
RewriteRule ^/costumers/([^/]+) /costumers/index.php [L]
RewriteRule ^/(.*)$ /index.php
-------------------------------------

По правилам, как я понял, RewriteRulы просматривается сверху вниз, если Pattern - подходит меняем на Substitution с [Flag(s)]. В моем случае стоит [L] кот. прекращает последующие правила как я понимаю.
Но думаю что мой .htaccess работать не будет.
Помогите разобратся, когда и что надо писать.

Или подскажите что я не правильно понял по теме mod_rewrite. C регулярными у меня проблема.

Дома под виндой 98 работает только такое правило:А на серваке эксперементироватьне охото.
RewriteCond %{REMOTE_ADDR} ^127\.0\.0\.1$
RewriteRule ^.* - [F].
Другие не хотят.
 

crocodile2u

http://vbolshov.org.ru
> "Но думаю что мой .htaccess работать не будет."

Твори, выдумывай, пробуй.

mod_rewrite работает одинаково и у тебя под виндой, и на сервере под *nix. Это - подсказка :).
 

gamma

Guest
Originally posted by crocodile2u

Твори, выдумывай, пробуй.

mod_rewrite работает одинаково и у тебя под виндой, и на сервере под *nix. Это - подсказка :).
Значет я правила не так написал?
Конструкции вроде нормальные, а вот сами вырыжения
типа ^/about-my/([^/]+) /index.php?act=about
скорее всего из-за них.
Кто-ниб. может объяснить в чем моя проблема(ну кроме таких
объяснений что нефиг тебе этим заниматся, лучше иди полы подметай!)
 

crocodile2u

http://vbolshov.org.ru
RewriteEngine On
RewriteBase /test/
RewriteRule ^about-my/?([^/]*) rw.php?act=about [L]

Работает.

Слэши у тебя были лишние.
 

gamma

Guest
Originally posted by crocodile2u
RewriteEngine On
RewriteBase /test/
RewriteRule ^about-my/?([^/]*) rw.php?act=about [L]

Работает.

Слэши у тебя были лишние.
Большое спасибо. РАботает.
А вот как на счет, Переменых сесий? и графики,
и линки которые в скриптах прописаны
например <form action='index.php' method='post'>
или
<a href='index.php?act=news&id=$row[id_news]'>$row[news_head]
Мне их менять на -
<a href='my-news/new/$row[id_news]'>$row[news_head]
????? Правильно?
 

crocodile2u

http://vbolshov.org.ru
Лучше все-таки добавлять к правилам условия: если REQUEST_FILENAME !-f. Это поможет не глючить картинкам и CSS. А экшны для формы ты уж сам прописывай. Я вообще не знаю, может, у тебя и никакого index.php там нету физически, и уж тем более не знаю структуру твоего приложения.
 

gamma

Guest
Ок спасибо! ща посмотрю как REQUEST_FILENAME !-f. правильно написать. Если работать не захочет, я напишу что случилось.Проконсультируешь?
Но я думаю что работать будет.
на счет index.php - он лежит в корне .www -
Вот только не я его писал. Придется опять ети каракули читать(Очень криво скрипт написан. Весь сайт почти одним index-ом работает(никаких модулей). Легче мне самому новые написать, но времени нет.
А ЧПУ меня попросили сделать.
Вот такая вот жизнь.:)
mod_rewrite c Post работает?
<form action='index.php' method='post'>
Если нет то все пост на get менять?
Ето ж сколько писать то придется?
 

crocodile2u

http://vbolshov.org.ru
post на get менять не надо (ну, в общем случае). mod_rewrite с POST работает. Сработает и action=index.php, и action=/about-my/. Главное, чтобы ТЫ САМ представлял себе, как и что работает.

Подсказать еще могу следующее - можешь не переписывать экшны у форм, а после обработки данных POST с пом. header("Location: /about-my/"); отправлять юзера на нужную страницу.

Вместо about-my подставь то, что тебе нужно. Кстати, можешь не писать новое правило на каждый однотипный редирект. Можно, например, написать что-то вроде

^(about-my|contacts|smth)/?[^/]* index.php?id=$1

---- НЕ совсем в тему ----
RewriteCond %{REQUEST_FILENAME} !-f#Юзер не запрашивает файл
RewriteCond %{REQUEST_FILENAME} !-d#Юзер не запрашивает папку
RewriteCond %{REQUEST_URI} !\.(gif)|(jpe?g)|(css)|(js)$#Юзер не запрашивает файл с картинкой или ЦСС

RewriteRule ^(.+) index.php?uri=$1&%{QUERY_STRING} [L]

Это правило используется очень часто. В индекс.пхп надо только правильно распарсить $_GET['uri'].
 

gamma

Guest
Спасибо очень ценная инфа.
Логику head-ера я понял(на будущее учтем), но как сделать, пока не представляю(разберемся!).

^(about-my|contacts|smth)/?[^/]* index.php?id=$1
Тоже все понятно.Спасибо.

Вот еще вопрос?
Ссылок с тремя перемеными у меня нет. максимум 2.
Надо чтоб срабатывало и
mysite/about-my
и
mysite/about-my/avto
а
mysite/about-my/avto/bla-bla-bla
нет. выдовалась ошибка.
пробывал так:
RewriteRule ^(about-my|contacts|smth)/?([^/]*) index.php?act=$1&id=$2.
Но когда набираю
mysite/about-my/avto/bla-bla-bla
Отправляет на mysite/about-my/avto/
но впринцыпе не так страшно. Но хотелось бы ошибку получить.
Где то сдесь видел скрипт распарсовки.
Не подскажешь?
А то самому не охото писать.
тогда можно будет одним правилом отделатся.
RewriteRule ^(?([^/]*)/?([^/]*) index.php?act=$1&id=$2.
Вот так я думаю получется.

-~{}~ 22.12.04 11:44:

Ссори ето правило не подходит.
да и RewriteCond %{REQUEST_FILENAME} !-f
распростаняется на все последушие правила?
или только на одно?И его каждый раз надо перед Rule писать?
 

crocodile2u

http://vbolshov.org.ru
1) На твоем месте я бы воспользовался тем вариантом, кот. я привел в конце предыд. своего поста, а потом просто распарсивал бы ;$_GET['uri'].

2) Готовых кодов здесь не дают.

3) RewriteCond %{REQUEST_FILENAME} !-f
распростаняется только на одно правило.

4) Советую почитать подробнее про mod_rewrite, многие вопросы отпадут сами собой.
 

gamma

Guest
Спасибо за помощь! больше не буду тебя беспокоит!
 
Сверху