web-dev-qa-db-ja.com

.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の正しい値を表示しています。

私のコードの問題は何ですか?どうすればこれを解決できますか?

14

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

11
Panama Jack