ФорумРазработкаУстановка и администрирование ПОВебсервер → Памажите с mod_rewrite

Памажите с mod_rewrite

  • Kikky

    Сообщения: 201 Репутация: N Группа: Кто попало

    Spritz 25 октября 2011 г. 5:45

    У меня вот такая стр-ра приложения:
    /Root
    /application
    /library
    /public


    Ложу в корень сайта .htaccess со следующим содержимым, но получаю ошибку 500:

    RewriteEngine on
    RewriteRule ^$ public/ [L]
    RewriteRule (.*) public/$1 [L]


    Я так понимаю, что первое правило перенаправляет http://site.ru на http://site.ru/public, а второе http://site.ru/var на http://site.ru/public/var..то что мне и нужно, но не работает. Помогите, уже все мозги себе выебал..
    Спустя 46 сек.
    хочу убрать /public из урла.. - )
    Спустя 101 сек.
    Нужно чтобы редиректило с http://site.ru на http://site.ru/public, но в урле было http://site.ru..вот
  • phpdude

    Сообщения: 26624 Репутация: N Группа: в ухо

    Spritz 25 октября 2011 г. 5:49, спустя 3 минуты 37 секунд

    (.*)

    так сделай, должно сканать если проблема вообще в этом

    (.+)
    Сапожник без сапог
  • Kikky

    Сообщения: 201 Репутация: N Группа: Кто попало

    Spritz 25 октября 2011 г. 5:57, спустя 7 минут 51 секунду

    не сканало ёпт, а в чём ещё проблема может быть?
  • phpdude

    Сообщения: 26624 Репутация: N Группа: в ухо

    Spritz 25 октября 2011 г. 6:02, спустя 5 минут 2 секунды

    я тебе по секрету скажу

    RewriteRule ^$ public/ [L]
    RewriteRule (.*) public/$1 [L]


    второе условие включает в себя первое

    тебе достаточно написать

    RewriteRule (.*) public/$1 [L]

    и получишь тотже эффект на 100%

    а вот почему у тебя не работает - глянь хотя бы в логи апача. чо там то пишут по тв? :)
    Сапожник без сапог
  • Kikky

    Сообщения: 201 Репутация: N Группа: Кто попало

    Spritz 25 октября 2011 г. 6:11, спустя 8 минут 39 секунд

    Спасибо

    127.0.0.1 - - [25/Oct/2011:13:07:36 +0300] "GET /go/public/ HTTP/1.1" 500 538


    запрос на /go/public/ поступает, в public'e же у меня и index.php лежит…
  • master

    Сообщения: 3236 Репутация: N Группа: Джедаи

    Spritz 25 октября 2011 г. 6:19, спустя 8 минут 25 секунд

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

    RewriteRule condition1 target1
    RewriteRule condition2 target2
    RewriteRule condition3 target3

    сначала урл проверяется на condition1 и если совпадает то происходит его коррекция в target1
    затем он переходит к condition2 -> коррекция, затем к condition3 -> корреция.
    затем(!!!) он опять переходит к condition1 и т.д.
    обработка реврайтом закончится тогда, когда ни одно из условий не выполнится за один прогон.

    флаг [L] означает не конец обработки rewriterule, а конец одного прогона. т.е.:

    RewriteRule condition1 target1
    RewriteRule condition2 target2 [L]
    RewriteRule condition3 target3

    отработает так:
    проверка condition1 -> коррекция в target1; проверка condition2 -> коррекция в target2; condition1 -> …

    соответственно одиночное правило тоже будет работать циклично, что, собственно, и происходит:
    RewriteRule    (.*) public/$1    [L]

    /a -> /public/a -> /public/public/a …
    надо делать так

    RewriteCond $1 !^(public/)
    RewriteRule (.*) /public/$1

    в одиночном правиле флаг L не имеет смысла
    Спустя 160 сек.
    можно добавить флаг NC (no-case)
    не всё полезно, что в swap полезло
  • master

    Сообщения: 3236 Репутация: N Группа: Джедаи

    Spritz 25 октября 2011 г. 6:25, спустя 5 минут 43 секунды

    тащемта если открыть какой-нибудь говнофреймворк можно увидеть что-то вроде

    RewriteEngine on
    RewriteCond %{REQUEST_FILENAME} -s [OR]
    RewriteCond %{REQUEST_FILENAME} -l [OR]
    RewriteCond %{REQUEST_FILENAME} -d
    RewriteRule ^.*$ - [NC,L]
    RewriteRule ^.*$ index.php [NC,L]

    (это я свой открыл, бгг)

    т.е. урл не коверкается, а просто определяется из переменной $_SERVER['REQUEST_URI']
    не всё полезно, что в swap полезло
  • Kikky

    Сообщения: 201 Репутация: N Группа: Кто попало

    Spritz 25 октября 2011 г. 6:41, спустя 15 минут 54 секунды

    master, спасибо за подробное объяснение.

    RewriteCond $1 !^(public/)
    RewriteRule (.*) /public/$1

    Эти правила работают, но не так как я хотел: / -> /public/, но и урле также отображается /public/, возможно ли делать вот так / -> /public/ и при этом в адресной строке отображать / без изменения стр-ры папок?
  • master

    Сообщения: 3236 Репутация: N Группа: Джедаи

    Spritz 25 октября 2011 г. 6:50, спустя 9 минут 7 секунд

    но и урле также отображается /public/

    в урле? ничего не отображается
    не всё полезно, что в swap полезло
  • Kikky

    Сообщения: 201 Репутация: N Группа: Кто попало

    Spritz 25 октября 2011 г. 6:57, спустя 7 минут 17 секунд

    Значит у меня в чём-то другом проблема, в root лежит такой .htaccess:
    RewriteEngine on

    RewriteCond $1 !^(public/)
    RewriteRule (.+) /public/$1

    AddDefaultCharset utf8

    , в /public .htaccess отсутствует..

    Когда я иду на localhost/go/ , то меня кидает на localhost/go/public, когда иду на localhost/go/a - 404 = /
  • master

    Сообщения: 3236 Репутация: N Группа: Джедаи

    Spritz 25 октября 2011 г. 7:02, спустя 5 минут 10 секунд

    положи хтаццесс в паблик, ёпта
    Спустя 129 сек.
    ааааа……
    бгг, лол
    Root - это и есть document root
    хотя им должен быть public

    пиши

    RewriteRule .* /public/index.php
    не всё полезно, что в swap полезло
  • Kikky

    Сообщения: 201 Репутация: N Группа: Кто попало

    Spritz 25 октября 2011 г. 7:39, спустя 37 минут 9 секунд

    wtf..действительно, посмотрел в httpd.conf, Root - это и есть document root..но
    <code>
    RewriteRule .* /public/index.php
    </code>
    не работает, когда ложу в корень, а вот такой:
    <code>
    RewriteCond $1 !^(public/)
    RewriteRule (.*) /public/$1
    </code>
    отображает приложение нормально, когда я обращаюсь просто на localhost =////
  • Kikky

    Сообщения: 201 Репутация: N Группа: Кто попало

    Spritz 25 октября 2011 г. 8:16, спустя 36 минут 37 секунд

    RewriteCond $1 !^(public/)
    RewriteRule (.*) /public/$1


    Залил на хостинг, такой .htaccess, работает нормально только на site.ru, когда пробую site.ru/en - пишет The requested URL /public/en was not found on this server, то есть .htaccess отрабатывает нормально, переадресовывает как нужно..но почему же тогда 404?
  • master

    Сообщения: 3236 Репутация: N Группа: Джедаи

    Spritz 25 октября 2011 г. 10:10, спустя 1 час 54 минуты 23 секунды

    я не вполне понимаю, в какую из папок какой хтаццес ты заливаешь
    не всё полезно, что в swap полезло
  • Kikky

    Сообщения: 201 Репутация: N Группа: Кто попало

    Spritz 25 октября 2011 г. 10:28, спустя 17 минут 21 секунду

    master, у меня на хостинге такая структура:

    /www - document root
    /application
    /library
    /public (тут index.php)
    /.htaccess ( c RewriteCond $1 !^(public/) RewriteRule (.*) /public/$1 такими правилами)

    …работает только на site.ru, если дальше идут какие-либо параметры - 404 :(

Пожалуйста, авторизуйтесь, чтобы написать комментарий!