Как я могу определить переменную в файле .htaccess и использовать ее?

Я определил файл htaccess для моего сайта с этим кодом:

RewriteEngine on
RewriteBase /

RewriteRule ^bit_auth\/?(.*)$ /cig/base3/auth/$1 [R=301,NC,L]
RewriteCond $1 !^(index\.php|images|robots\.txt|assets|themes|includes)
RewriteRule ^(.*)$ /cig/base3/index.php/$1 [L]

Я хочу сохранить корневой путь моего сайта в переменной следующим образом:

RewriteEngine on
RewriteBase /
SetEnv BASE_PATH "/cig/base3"

RewriteRule ^bit_auth\/?(.*)$ %{ENV:BASE_PATH}/auth/$1 [R=301,NC,L]
RewriteCond $1 !^(index\.php|images|robots\.txt|assets|themes|includes)
RewriteRule ^(.*)$ %{ENV:BASE_PATH}/index.php/$1 [L]

потому что мне может понадобиться использовать значение BASE_PATH в дополнительных кодах позже, а также его можно изменить, и я не хочу каждый раз искать и заменять его в файле htaccess. Но когда я использую код выше, в файле htaccess %{ENV:BASE_PATH} возвращает пустое значение, а не ожидаемое /cig/base3, но в php, когда я его вызываю, используя:

<?php $specialPath = getenv('BASE_PATH'); var_dump($specialPath)?>

отображается правильное значение /cig/base3.

В чем проблема в моих кодах и как я могу это решить?

Ответ 1

Вы не можете использовать SetEnv таким образом, потому что он еще не обработан.

Внутренние переменные среды, заданные этой директивой, устанавливаются после запускаются самые ранние директивы обработки запроса, такие как доступ управление и сопоставление URI-to-filename. Если переменная окружения вы настраиваетесь как вход в этот ранний этап обработки таких как директива RewriteRule, вместо этого вы должны установить переменная среды с помощью SetEnvIf.

То, что вы ищете, это setenvif вместо SetEnv

Итак, вы должны сделать что-то вроде

SetEnvIf Request_URI "^.*" base_path=/cig/base3

http://httpd.apache.org/docs/2.2/mod/mod_setenvif.html#setenvif