web-dev-qa-db-ja.com

.htaccessで環境変数を設定し、PHP

.htaccessファイルに環境変数を設定し、PHPで取得しようとしています。ここでSO=.

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

SetEnv SPECIAL_PATH /foo/bin

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

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

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

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

41
Bruno Cloutier

設定に.htaccessのAllowOverridesがあると仮定すると、これが機能するためにはApacheでmod_envを有効にする必要があります。

Apache-mod_env

30
Jacob S

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

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

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

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

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

以下は、環境変数を使用するために生鮮プレス5Gブラックリスト/ファイアウォールを変更することから取ったサーバー環境変数を設定および使用するいくつかの.htaccessの方法です http://perishablepress.com/5g-blacklist-2013/ 報告:

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/ である程度詳しく説明します

8
George Lerner