46

.htaccess ファイルに環境変数を設定し、PHP で取得しようとしています。ここSOで他のスレッドをたくさん見てきましたが、これまでに試したことはすべて失敗しました。

この行を .htaccess ファイルに追加しました。

SetEnv SPECIAL_PATH /foo/bin

getenv() PHP 関数を使用してこの値を取得しようとしました。

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

使用可能な環境変数のリストを表示するために phpinfo() を実行しましたが、SPECIAL_PATH がありません。なぜこれが機能しないのか、私は困惑しています。

ありがとうございました!

4

2 に答える 2

33

Assuming your configuration has AllowOverrides with .htaccess, you must enable mod_env in Apache for this to work.

Apache - mod_env

于 2013-07-09T14:03:36.470 に答える
9

Apache Docs custom-error.html は、エラー処理ページに渡される環境変数をカバーしています

「REDIRECT_ 環境変数は、リダイレクト前に存在していた環境変数から作成されます。それらは REDIRECT_ プレフィックスで名前が変更されます。つまり、 にHTTP_USER_AGENTなりREDIRECT_HTTP_USER_AGENTます。」

「ErrorDocument ターゲットが外部リダイレクト (サーバーと同じホストを参照している場合でも、http: のようなスキーム名で始まるもの) の場合、これらは設定されません。」

SetEnv について次のように述べています。「このディレクティブによって設定される内部環境変数は、アクセス制御や URI からファイル名へのマッピングなど、ほとんどの初期の要求処理ディレクティブが実行された後に設定されます。設定している環境変数がこれへの入力として意図されている場合、 RewriteRule ディレクティブなどの処理の初期段階では、代わりに SetEnvIf で環境変数を設定する必要があります。」

一部のサーバーでは、セキュリティ上の理由から、ユーザーが宣言した環境変数を「HTTP_」で開始する必要があります。たとえば、次のようになります。 SetEnv HTTP_MY_VARIABLE "my value"

Perishable Press 5G ブラックリスト/ファイアウォールhttp://perishablepress.com/5g-blacklist-2013/を変更して環境変数レポートを使用することから得た、サーバー環境変数を設定および使用する .htaccess の方法を次に示します。

SetEnv myServerName %{SERVER_NAME}

RewriteCond %{QUERY_STRING} (base64_encode|localhost|mosconfig|open_basedir) [NC,OR]
RewriteCond %{QUERY_STRING} (boot\.ini|echo.*kae|etc/passwd) [NC,OR]
RewriteCond %{QUERY_STRING} (GLOBALS|REQUEST)(=|\[|%) [NC]
RewriteRule .* - [E=badQueryString:%0--%1--%2,F,L]

SetEnvIfNoCase User-Agent ^$ noUserAgent
SetEnvIfNoCase User-Agent (binlar|casper|cmsworldmap|comodo|diavol|dotbot|feedfinder|flicky|ia_archiver|jakarta|kmccrew|nutch|planetwork|purebot|pycurl|skygrid|sucker|turnit|vikspider|zmeu) badUserAgent=$1

<limit GET POST PUT>
  Order Allow,Deny
  Allow from all
  Deny from env=badUserAgent
</limit>

$0--%1--%2 などのパラメーターの使用に注意してください。%0 は完全な文字列を示し、%1 は括弧で囲まれた最初のステートメントからの一致を示し、%2 は 2 番目のステートメントを示します。ハイフンは、パラメーターの結果を視覚的に区別するためのリテラル表示文字です (そこにスペースを入れる方法は考えないでください)。


環境変数にアクセスするための PHP メソッドを次に示します (私の場合は 403.php と 404.php から)。phpinfo() ではなく $ SERVER を参照することに注意してください。また、変数の先頭に REDIRECT が付けられることに 注意してください。また、403/404 リダイレクトでは、QUERY_STRING が REDIRECT_QUERY_STRING になることにも注意してください。これは簡単にサーバーに依存する可能性があるものなので、実際の値については $_SERVER を確認してください。例えば、

if (getenv("HTTP_REFERER") !== FALSE) {
    $httpref = getenv("HTTP_REFERER");
} else {
    $httpref = '';
}
if (isset($_SERVER['REDIRECT_STATUS'])) {
    $status = $_SERVER['REDIRECT_STATUS'];
} else {
    $status = '';
}
if (isset($_SERVER['REMOTE_HOST'])) {
    $remoteHost = $_SERVER['REMOTE_HOST'];
} else {
    $remoteHost = '';
}

if (isset($_SERVER['REDIRECT_QUERY_STRING'])) {
    $querystring = $_SERVER['REDIRECT_QUERY_STRING'];
} else {
    $querystring = '';
}

if (isset($_SERVER['REDIRECT_noUserAgent']) ) {
    $htaccessErrors[] = 'NoUserAgent';
}
if (getenv("REDIRECT_badQueryString") !== FALSE) {
/* must exactly match what shows up in $_SERVER, is case sensitive (e.g. badQueryString not BadQueryString) */
    $htaccessErrors[] = 'badQueryString:'.getenv("REDIRECT_badQueryString");
}

http://lcblog.lernerconsult.com/2013-server-alert-you-file-not-found-errors/で詳しく説明します

于 2013-09-17T22:30:13.423 に答える