На сайте есть файлы:
/page/index.php
/page/news.php
/page/gallery.php
и т.д.
1. Как сделать чтобы они открывались по таким ссылкам:
/index.php
/news.php
/gallery.php
и т.д.
2. Или таким:
/p/index.php
/p/news.php
/p/gallery.php
и т.д.
3. И чтоб в 1. для некоторых URL можно было делать исключения, например:
по /index.php открывался /index.php а не /page/index.php
Заранее спасибо! =)
22 июня 2009 в 17:05
Да.. работает почти как надо. Но может все таки кто нибудь знает способ как сделать чтобы список правил не повторялся заного?
Например надо к каждому URL подписать букву "G" в конце.
RewriteRule (.*) $1G
Это правило будет повторяться.. как сделать чтобы оно сработало только один раз?
20 июня 2009 в 11:05
ай, молодец!
20 июня 2009 в 11:00
Настроил RewriteLogLevel, почитал получившиеся логи и погуглил.
Оказалось что флаг [L] останавливает только от выполнения следующих RewriteRule в списке. То есть если какой либо RewriteRule применился то все начинается заного, и это НИКАК не остановить! Либо есть способ который я найти не смог.
Правило написал так:
RewriteCond $1 !^/?(css/|index\.php$|page/.*\.php$|robots\.txt$|favicon.ico$)
RewriteRule (.+) /page/$1\.php
Оно сначала изменяет URL потом при следующем цикле проверяет измнен он на /page/$1\.php или нет. При этом запросы типа /page/$1\.php не преобразуются. Например /page/aa.php не пребразуется. Но хоть так работает.
19 июня 2009 в 23:02
вообще если хочешь разобраться в mod_rewrite, то советую настроить сервак с использованием RewriteLogLevel (для начала значения 1-3 хватит)
19 июня 2009 в 23:01
знак $ в теле регулярного выражения (в данном синтаксисе) означает конец строки.
в общем, курить мануалы
19 июня 2009 в 23:00
Почему у меня не работает??
RewriteCond $1 !^(css/|index\.php$|page|robots\.txt$|favicon.ico$)
RewriteRule (.+) /page/$1\.php [L]
Я добавил знак $ к каждому исключению, чтобы например по favicon.icoss открывалась /page/favicon.icoss.php
Но если $ поставить и после page то зависает. В логах пишется:
Request exceeded the limit of 10 internal redirects due to probable configuration error.
Флаг [L] на это никак не влияет.
Почему так происходит? Почему после этого RewriteRule оно еще раз повторяет весь процесс?
23 апреля 2009 в 1:00
Не совсем так. Т.е. иногда бывает совсем не так.
Если пишешь какую-нидь регулярку, которая преобразует вообще всё, что к ней приходит, но не хотелось бы, чтобы реврайту подвергались определенные урлы, то это более чем логично поставить исключение. Я даже немного смущен…
23 апреля 2009 в 0:05
Вообще, mod_rewrite обычно используют, чтобы получать красивые урлы, типа: /index, /news, /gallery, а не /index.php, который и так доступен.
22 апреля 2009 в 22:03
А гуглом, кстати, должен владеть любой программист, ведь это очень мощная штука…
#6 прости, не выдержал…
ещё раз, 2 all:
regex syntax
Или вам, судари, ещё и ссылку сюда кинуть надобно?
22 апреля 2009 в 21:03
#2, классно. я вот тоже всё никак не научусь как писать эти правила. И для всяких функций наподобие preg_replace тоже не умею шаблоны делать
22 апреля 2009 в 21:03
Регулярные выражения + статья на Википедии "htaccess" + статьи, доступные по ссылкам из статьи в Википедии + практика
Это всё что нужно, чтобы научиться. А регулярными выражениями, кстати, должен владеть любой программист, ведь это очень мощная штука…
22 апреля 2009 в 17:01
regex syntax
22 апреля 2009 в 16:02
Хмм.. Спасибо!
А то я эти выражения пока не умею писать.
22 апреля 2009 в 16:00
1.
RewriteEngine on
RewriteCond $1 !^(page|robots\.txt|favicon)
RewriteRule ^(.*)$ /page/$1
2.
RewriteEngine on
RewriteCond $1 !^(page|robots\.txt|favicon)
RewriteRule ^/p/(.*)$ /page/$1
3.
RewriteEngine on
RewriteCond $1 !^(index\.php)
RewriteRule ^/p/(.*)$ /page/$1
Что-то вроде того. Тут все адреса, кроме начинающихся с page, robots.txt и favicon, будут переписываться в начинающиеся с page. Эти решения требуют проверки, я их сходу из головы написал, вероятность ошибок высока….
В третьем варианте делаем исключение только на индекс.пхп, сравни его с остальными вариантами.
И не забудь включить mod_rewrite