singlepost

mod_rewriteкак изменить URL-ы << На главную или назад  

На сайте есть файлы:
/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

Заранее спасибо! =)

14 ответов в теме “mod_rewriteкак изменить URL-ы”

  1. 14
    Алексей Макаров ответил:

    Да.. работает почти как надо. Но может все таки кто нибудь знает способ как сделать чтобы список правил не повторялся заного?

    Например надо к каждому URL подписать букву "G" в конце.

    RewriteRule (.*) $1G

    Это правило будет повторяться.. как сделать чтобы оно сработало только один раз?

  2. 13
    Dain Here ответил:

    ай, молодец!

  3. 12
    Алексей Макаров ответил:

    Настроил 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 не пребразуется. Но хоть так работает.

  4. 11
    Dain Here ответил:

    вообще если хочешь разобраться в mod_rewrite, то советую настроить сервак с использованием RewriteLogLevel (для начала значения 1-3 хватит)

  5. 10
    Dain Here ответил:

    знак $ в теле регулярного выражения (в данном синтаксисе) означает конец строки.

    в общем, курить мануалы

  6. 9
    Алексей Макаров ответил:

    Почему у меня не работает??

    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 оно еще раз повторяет весь процесс?

  7. 8
    Dain Here ответил:

    Не совсем так. Т.е. иногда бывает совсем не так.
    Если пишешь какую-нидь регулярку, которая преобразует вообще всё, что к ней приходит, но не хотелось бы, чтобы реврайту подвергались определенные урлы, то это более чем логично поставить исключение. Я даже немного смущен…

  8. 7
    Алексей Терещенко ответил:

    Вообще, mod_rewrite обычно используют, чтобы получать красивые урлы, типа: /index, /news, /gallery, а не /index.php, который и так доступен.

  9. 6
    Dain Here ответил:

    А гуглом, кстати, должен владеть любой программист, ведь это очень мощная штука…

    #6 прости, не выдержал…

    ещё раз, 2 all:

    regex syntax

    Или вам, судари, ещё и ссылку сюда кинуть надобно?

  10. 5
    Almaz Ilyasov ответил:

    #2, классно. я вот тоже всё никак не научусь как писать эти правила. И для всяких функций наподобие preg_replace тоже не умею шаблоны делать

  11. 4
    Евгений Козобродов ответил:

    Регулярные выражения + статья на Википедии "htaccess" + статьи, доступные по ссылкам из статьи в Википедии + практика

    Это всё что нужно, чтобы научиться. А регулярными выражениями, кстати, должен владеть любой программист, ведь это очень мощная штука…

  12. 3
    Dain Here ответил:

    regex syntax

  13. 2
    Алексей Макаров ответил:

    Хмм.. Спасибо!
    А то я эти выражения пока не умею писать.

  14. 1
    Евгений Козобродов ответил:

    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

Клуб программистов работает уже ой-ой-ой сколько, а если поточнее, то с 2007 года.