Внутренняя перезапись + Установка переменных окружения с помощью mod-rewrite / .htaccess - PullRequest
1 голос
/ 30 октября 2010

Я пытаюсь добиться следующего через mod_rewrite:

1. Какова основная структура каталогов?

  • /
    • main / (папка)
      • куча PHP-файлов
    • some_folder / (папка)
    • another_folder / (папка)
    • ... (произвольное количество таких папок)
    • Yet_another_folder / (папка)
    • .htaccess (волшебство идет сюда)

2. Что я пытаюсь сделать?

В этом сценарии все исполняемые файлы содержатся в главной папке, и к ним следует обращаться только через дополнительные папки. Более того, сценарии PHP полагаются на переменную окружения apache для передачи им некоторой информации, которая связана с именем папки, через которую они доступны. Другое специальное требование заключается в том, что главная папка не должна быть доступна напрямую (только через внутреннее перенаправление).

3. Как далеко я прошел?

Я реализовал следующий файл .htaccess:
RewriteEngine On<br> RewriteCond %{REQUEST_URI} !^/(main|another)/.*$<br> RewriteRule ^(.*)/(.*)$ /main/$2 [QSA,L,env=VAR_NAME:$1/weird_include.php]
Обычно он выполняет перенаправление, однако есть некоторые проблемы ...

4. В чем дело?

При таком подходе к папке mainanother тоже) можно получить прямой доступ, и я хочу, чтобы она была доступна только через одну из вспомогательных папок. Вторая проблема заключается в том, что, поскольку существует перезапись, mod_rewrite добавляет префикс REDIRECT_ к переменным, и, поскольку я совершенно не контролирую исходный код, находящийся в main, и для него требуются определенные имена переменных, это не работать на меня вообще. Также я еще не нашел достойного способа изолировать доступ к папкам main и other-main ...

5. Где, я полагаю, ключ к палатке?

Этот пост в PHP-документе по этой теме предлагает добавить правило, подобное этому
RewriteRule ^index\.php$ \ - [E=VAR1:%{REDIRECT_VAR1},E=VAR2:%{REDIRECT_VAR2},L]
решит проблему. Однако я не вижу, как я могу изменить это, чтобы соответствовать требованию «нет прямого доступа». А также - какие накладные расходы вносит mod_rewrite? Другим важным вопросом будет, как ограничить доступ к main и other-main вышеупомянутым способом?
Будет ли добавление файла .htaccess в эти две папки, который проверяет наличие REDIRECT_VAR_NAME1 и, если он присутствует, перезаписывает его в VAR_NAME, оставляя URL-адрес нетронутым, а если он не перенаправляется на 403 forbidden, то делает ли это? А также любой намек на то, что накладные расходы это будет оценено.

1 Ответ

1 голос
/ 30 октября 2010

Если сценарии в / main / абсолютно требуют, чтобы переменные окружения имели конкретные имена, и если вы не можете изменить переменные окружения, используйте директиву auto_prepend_file в php.ini, чтобы включить определенный файл PHP в начале каждый скрипт PHP. Это позволит вам предварительно обрабатывать переменные окружения, фактически не изменяя другие файлы.

Например, если вы хотите FOO, но вы застряли с REDIRECT_FOO, поместите следующую строку в любой файл PHP, который вы определили как auto_prepend. Это переназначит REDIRECT_FOO на FOO. Сценарий, который исполняется после слов, не имеет ни малейшего понятия, что произошло.

$_ENV['FOO'] = $_ENV['REDIRECT_FOO'];

По вашему другому вопросу, да, переписывание всего этого добавляет немного накладных расходов, но я не уверен, насколько. Это, вероятно, незначительно по сравнению с тем, что делает ваш PHP-скрипт.

Чтобы предотвратить прямой доступ к / main /, добавьте в ваш файл .htaccess следующее.

<Location /main/>
    Order deny,allow
    Deny from all
</Location>

Кстати, если у вас есть какой-либо контроль над самими сценариями, исправьте их, а не полагайтесь на подобные хаки.

...