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 2

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, которая соответствует правилу, отмечая, что правило сам частично оценивается (применяется шаблон) до того, как любое из условий проверяется.