htaccess перезаписывает базу данных в подкаталогах
В проекте, который у меня есть .htaccess файлы во многих подкаталогах.
Вот пример структуры:
проект/.htaccess
проект / администратор/.htaccess
Project / admin / pdf/.htaccess
В последнем я успешно использую следующее:
Options +FollowSymLinks
RewriteEngine On
RewriteBase /project/admin/pdf/
RewriteRule ^([pdf.actions]+)$ pdf.out.actions.php [QSA]
Это прекрасно работает, если папка проекта находится непосредственно в корневом каталоге. все остальные подкаталоги имеют одинаковые реврайт логике, теперь, если пользователю нужно поставить проект в любом другой каталог, а не root, он / она должен изменить все RewriteBase во всех файлах htaccess во всех подкаталогах проекта.
Мой вопрос: как переписать содержимое htaccess, чтобы получить тот же результат, что и выше, но с "динамической" базой или без базы...и так далее? я попробовал кое-что, но безуспешно.
Я удалил строку RewriteBase /project/admin/pdf/
и протестировал ее, я получаю сайт не найден...и так далее!
Есть Идеи?
Спасибо
1 ответ:
Вы можете попробовать добавить что-то вроде этого в начало ваших правил:
RewriteCond %{ENV:URI} ^$ RewriteRule ^(.*)$ - [ENV=URI:$1] RewriteCond %{ENV:BASE} ^$ RewriteCond %{ENV:URI}::%{REQUEST_URI} ^(.*)::(.*?)\1$ RewriteRule ^ - [ENV=BASE:%2]
И тогда вместо того, чтобы использовать
RewriteBase
, вам придется везде включать переменную окруженияBASE
. Например:RewriteRule ^([pdf\.actions]+)$ %{ENV:BASE}/pdf.out.actions.php [QSA]
Условия делают пару вещей, но оба правила ничего не меняют в URI и только добавляют переменные среды. Первое условие необходимо, потому что оно захватывает запрошенный URI до того, как с ним что-либо будет сделано, и сохраняет его. Это важно, потому что группировка(.*)
в правиле имеет основание , лишенное. Мы хотим, чтобы неизмененный Ури был сорван с базы. Таким образом, переменная окруженияURI
- это URI с удаленной базой. Второе условие необходимо, поскольку оно сравнивает переменную окруженияURI
с переменной окружения%{REQUEST_URI}
, которая является всем URI, включая базовую. Это сравнение дает нам часть, которая была снята, или основание, и которая будет сохранена вBASE
переменная окружения.Условия, которые совпадают с
^$
, просто гарантируют, что это первый раз через правила (то есть ни одна из переменных среды не была установлена). Механизм перезаписи будет циклическим, поэтому мы хотим установить их только в первый раз .
EDIT: на самом деле, теперь, когда я смотрю на него, вы, вероятно, могли бы оставить Первый:
RewriteCond %{ENV:BASE} ^$ RewriteCond $1::%{REQUEST_URI} ^(.*)::(.*?)\1$ RewriteRule ^(.*)$ - [ENV=BASE:%2]
Используя обратную связь
$1
, которая соответствует правилу, отмечая, что правило сам частично оценивается (применяется шаблон) до того, как любое из условий проверяется.