|
|
|
|
|
для: 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
(14.08.2009 в 16:20)
| | Задача усложнилась =( Теперь ещё надо, чтобы http://site.ru/page превращалась в http://site.ru/page/ внешним редиректом, а http://site.ru/page/ превращалась в /page.php внутренним редиректом. Это всё при условии, что page.php есть на сервере. Это я вообще даже примерно не могу покак сделать =( | |
|
|
|
|
|
|
| Здравствуйте. Есть папка ~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 и чтобы остальные пункты не перестали работать =) | |
|
|
|
|