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

Форум Apache

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

 

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

вид форума:
Линейный форум (новые сообщения вниз) Структурный форум

тема: Правила RewriteEngine для перенаправления запросов в другую папку

Сообщения:  [1-3] 

 
 автор: heed   (16.08.2009 в 02:18)   письмо автору
 
   для: Phantom   (15.08.2009 в 18:19)
 

Наверное какое-нибудь похожее на это получится
RewriteEngine On
RewriteBase /

RewriteCond %{QUERY_STRING} !^xtest=1
RewriteRule ^~modules index.php  [L]

RewriteCond %{DOCUMENT_ROOT}/~modules%{REQUEST_URI} -d [OR]
RewriteCond %{DOCUMENT_ROOT}/~modules%{REQUEST_URI} -f
RewriteRule . ~modules%{REQUEST_URI}?xtest=1 [QSA,L]

RewriteCond %{REQUEST_URI} ^/([a-z]+)/?$
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule . %1.php  [QSA,L]

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule .  index.php
смог сделать что-то похожее только если ?xtest=1 кое-где прилеплять
, и не пойму зачем переадресация с добавлением слэша

// upd
Перечитал и что-то не уверен в работоспособности ,)

  Ответить  
 
 автор: Phantom   (15.08.2009 в 18:19)   письмо автору
 
   для: Phantom   (14.08.2009 в 16:20)
 

Задача усложнилась =( Теперь ещё надо, чтобы http://site.ru/page превращалась в http://site.ru/page/ внешним редиректом, а http://site.ru/page/ превращалась в /page.php внутренним редиректом. Это всё при условии, что page.php есть на сервере. Это я вообще даже примерно не могу покак сделать =(

  Ответить  
 
 автор: Phantom   (14.08.2009 в 16:20)   письмо автору
 
 

Здравствуйте. Есть папка ~modules в корне (document_root). В ней лежат другие папки: forum, news, и так далее, разделы сайта в общем. Нужно перенаправлять все запросы так, словно все разделы лежат в корне, а не в папке ~modules. Эта задачка вынесла мне вчера весь мозг. =) Сейчас объясню все нюансы, которые нужно учесть:

1) Все несуществующие запросы надо кидать на /index.php (внутренним редиректом). Это в принципе просто, если больше никаких условий не требуется:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php [L]

То есть проверяем, есть ли такая папка или файл на сервере и, если нет, то перекидываем на index.php

2) На сайте также будут папки, в которые доступ для пользователя нужно запретить. И все 403 ошибки нужно тоже кидать на /index.php . Это тоже просто:
ErrorDocument 403 /index.php

Таким же образом можно было поступить с несуществующими URL, но тогда лог будет забиваться ошибками и т. п.

3) В папку ~modules тоже нужно запретить доступ и переадресовывать на index.php . Вот тут уже начинаются проблемы. Запретить доступ через .htaccess я для этой директории не могу, так как в ней лежат модули сайта, к которым должен быть доступ через редиректы. Также надо запретить доступ к ~modules/forum/ и остальным вложенным папкам. У меня получалось добиться похожего результата, запрос переадресовывается на /index.php , но если перейти по ссылке http://site.ru/~modules , то она в строке браузера превращается в http://site.ru/~modules/ , а выдаётся index.php. То есть сервер видимо сначала проверяет, есть ли такая папка на сервере, если есть, то он кидает 301 редирект, чтобы появился слэш в конце и только после этого срабатывает мод реврайт со своим правилом. ЧТо за тупость? Разве мод реврайт не должен срабатывать раньше этого? Вот этот аспект очень раздражает, как с ним можно справиться?

4) Нужно перенаправлять внутренним редиректом все запросы типа http://site.ru/forum/ на /~modules/forum/. Притом, если в адресной строке ввели http://site.ru/forum (без слэша на конце) и папка forum реально существует в папке ~modules, то нужно кинуть 301 редирект на http://site.ru/forum/ (со слэшем на конце). С этим я справился примерно так:
RewriteCond %{DOCUMENT_ROOT}/~modules%{REQUEST_URI} -d
RewriteRule ^(.*)$ ~modules/$1 [C]
RewriteRule ^~modules/(.*[^/])$ /$1/ [R=301,L]

Таким образом будут перенаправляться даже вложенные папки, например http://site.ru/forum/dir1/dir2/ при условии, что они существуют на сервере конечно.

5) Также надо не забыть о файлах, и запросы типа http://site.ru/forum/file.txt переадресовывать на /~modules/forum/file.txt . Это я сделал так:
RewriteCond %{DOCUMENT_ROOT}/~modules%{REQUEST_URI} -f
RewriteRule ^(.*)$ ~modules/$1 [L]


6) Вот это на мой взгляд самое сложное, что нужно сделать, так как у меня даже близко это не получилось. Нужно все несуществующие запросы типа http://site.ru/forum/aukn/ayjby556/drgg/ перенаправлять не на /index.php , а согласно правилам в .htaccess в папке ~modules/forum/ . То есть если там правил нет, то так и кидаем на /index.php , но если там есть файл .htaccess с какими-либо правилами, то нужно их учитывать в первую очередь.

В данный момент стоят такие правила именно в таком порядке:
RewriteEngine On
RewriteCond %{DOCUMENT_ROOT}/~modules%{REQUEST_URI} -f
RewriteRule ^(.*)$ ~modules/$1 [L]
RewriteCond %{DOCUMENT_ROOT}/~modules%{REQUEST_URI} -d
RewriteRule ^(.*)$ ~modules/$1 [C]
RewriteRule ^~modules/(.*[^/])$ /$1/ [R=301,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php [L]


====================================

Помогите, пожалуйста, с пунктами 3 и 6 и чтобы остальные пункты не перестали работать =)

  Ответить  

Сообщения:  [1-3] 

Форум разработан IT-студией SoftTime
Rambler's Top100
вверх

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