8
8

More than 5 years have passed since last update.

mod_php だと .htaccess の SetEnv は環境変数にならない

Posted at

なぜか今までまったく気づかなかった。

次のような .htaccess をドキュメントルートに置きます。

.htaccess
SetEnv http_proxy http://192.0.2.123:8080

次のコードをドキュメントルートに置いて表示すると、コメントに記載した通りに出力されます。

<?php
var_dump(getenv('http_proxy'));         // "http://192.0.2.123:8080"
var_dump(trim(`env|grep http_proxy`));  // ""

putenv('http_proxy=http://192.0.2.123:8080');

var_dump(getenv('http_proxy'));         // "http://192.0.2.123:8080"
var_dump(trim(`env|grep http_proxy`));  // "http_proxy=http://192.0.2.123:8080"

putenv より前の場合、.htaccessSetEnv の値が getenv なら取得できるにも関わらず /usr/bin/env の結果に http_proxy が含まれません。

putenv の後の場合、/usr/bin/env の結果にも http_proxy が含まれます。

次のようなコードでも、1回目の curl_exec はプロキシを経由しませんが、2回目の curl_exec はプロキシを経由します。

<?php
var_dump(getenv('http_proxy')); // "http://192.0.2.123:8080"

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://www.yahoo.co.jp/');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
var_dump(curl_exec($ch));
curl_close($ch);

putenv('http_proxy=http://192.0.2.123:8080');

var_dump(getenv('http_proxy')); // "http://192.0.2.123:8080"

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://www.yahoo.co.jp/');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
var_dump(curl_exec($ch));
curl_close($ch);

PHP の getenv は getenv の単なるラッパーではなく、SAPI によって微妙に異なるようです。

php-src/basic_functions.c at php-5.6.2 · php/php-src

8
8
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
8