Я определил файл 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 .
В чем проблема в моих кодах и как я могу это решить?
Вы не можете использовать SetEnv таким образом, потому что он еще не обработан.
Переменные внутренней среды, заданные этой директивой, устанавливаются после запуска большинства ранних директив обработки запросов, таких как управление доступом и сопоставление URI-к-имени файла. Если переменная среды, которую вы устанавливаете, подразумевается как вход в эту раннюю фазу обработки, такую как директива RewriteRule, вместо этого вы должны установить переменную окружения с помощью SetEnvIf.
То, что вы ищете, это setenvif вместо SetEnv
Поэтому вы должны быть способны сделать что-то вроде
SetEnvIf Request_URI "^.*" base_path=/cig/base3
http://httpd.apache.org/docs/2.2/mod/mod_setenvif.html#setenvif