レンタルサーバー・自宅サーバー設定・構築のヒント
レンタルサーバー・自宅サーバー設定・構築のヒント - レンタルサーバー・自宅サーバーの設定・構築情報を公開しています。

ApacheのSetEnvで設定した環境変数は、RewriteCond,SetEnvIfでは参照できない(ついでにrewriteモジュールのログもとってみた)

2013年4月19日 2014年1月11日
apache setenv

ApacheのSetEnvで設定した環境変数は、 RewriteCond , SetEnvIf など環境変数を参照するディレクティブから参照できないです。
これは、随分前からあることなんですが、日本語訳が2.4まで行われなかったことに起因して、これだけ情報がないんでしょうね。

Apacheの2.0 の英文ドキュメント上には、以下のようにあります。
The SetEnv directive runs late during request processing meaning that directives such as SetEnvIf and RewriteCond will not see the variables set with it.
この日本語訳が、Apacheの 2.4 の日本語ドキュメント上に以下のようにあります。
SetEnv はリクエスト処理の 段階の中でも遅くに実行されます。つまり SetEnvIf や RewriteCond などからは、変数がそこで設定されていることがわかりません。

ApacheのSetEnvで設定した環境変数は、RewriteCond,SetEnvIfでは参照できない

先にも書いたように、
ApacheのSetEnvで設定した環境変数は、 RewriteCond , SetEnvIf など環境変数を参照するディレクティブから参照できないです。


できないことを確認してみる

先のように ApacheのSetEnvで設定した環境変数は、RewriteCond,SetEnvIfでは参照できない ことを確認してみます。

例えば、/var/www/html/ がドキュメントのルートディレクトリとすると、以下のように設定したとします。


/var/www/html/.htaccess

RewriteEngine On
SetEnv VAL_A 1
RewriteCond %{ENV:VAL_A}  1
RewriteRule ^$ /readme.html

これの期待している動作は、

無条件にルートディレクトリへの参照は、readme.html へリダイレクトする

なのですが、これは、全く動作しません。

これは、Rewriteモジュールのログを確認してみるとすぐにわかります。

...
192.168.1.100 - - [18/Apr/2013:09:27:18 +0900] [www.example.com/sid#2e78450][rid#30ee798/initial] (4) [perdir /var/www/html/] RewriteCond: input='' pattern='1' => not-matched
...

このログの意味は、
RewriteCondで指定された入力情報(ここでは、 %{ENV:VAL_A})が 空(=”)で、チェックパターンは、‘1’でした。
結果は、not-matched (一致しなかった)ということです。

当然ですよね、入力情報が空(=”)なんですからね。

このように直前で設定した環境変数は参照できません。(参照しても値が設定されていないのです。)

先のログ出力のように Rewriteの判定内容などのログを出力するには、
Rewriteモジュールのログを 以下のように VirtualHost 内に設定すればOKです。
<VirtualHost *:80>
ServerName www.example.com
DocumentRoot "/var/www/html"
DirectoryIndex index.php index.html
...
RewriteLog "/var/log/httpd.rewrite.log"
RewriteLogLevel 9
...
</VirtualHost>
RewriteLog : ログの出力先ファイル名を指定します。
RewriteLogLevel : ログレベルを指定します。9以上は、ほぼ全てのログ情報を出力しますので、何か問題があって情報を採取したい場合は、まず、9を設定しておきましょう。

設定を終えたら、Apacheを再起動しましょう。
$ /etc/init.d/httpd restart
...

回避先(SetEnvIf)を確認してみる

この回避策としてあるのが、SetEnvIf (or SetEnvIfNoCase) ディレクティブを SetEnv の代わりに使用することです。

先の できないことを確認してみる で設定した例(/var/www/html/.htaccess)は、以下のように編集することになります。


/var/www/html/.htaccess

RewriteEngine On
SetEnvIf _ .* VAL_A=1
RewriteCond %{ENV:VAL_A}  1
RewriteRule ^$ /readme.html

SetEnv VAL_A 1SetEnvIf _ .* VAL_A=1 と変更されました。
この設定では、無条件にVAL_A に 1 を設定するようになっています。

これを実行してみると、

無条件にルートディレクトリへの参照は、readme.html へリダイレクトする

ようになります。

これも同じように、Rewriteモジュールのログを確認してみるとすぐにわかります。

...
192.168.1.100 - - [18/Apr/2013:11:36:46 +0900] [www.example.com/sid#2e78450][rid#30ee798/initial] (4) [perdir /var/www/html/] RewriteCond: input='1' pattern='1' => matched
...

RewriteCondで指定された入力情報(ここでは、 %{ENV:VAL_A})が ‘1’で、チェックパターンは、‘1’でした。
結果は、matched (一致した)となって期待どおりの動作になりました。

複雑な条件でリダイレクトしてみる(おまけ)

最後に、この環境設定(SetEnvIf (or SetEnvIfNoCase) ディレクティブ)を上手く使うとリダイレクトの条件設定が楽になることがあります。

先の 回避先(SetEnvIf)を確認してみる で設定した例(/var/www/html/.htaccess)は、あまりにも単純ですが、 実際にリダイレクト(転送)の条件は、そうそう単純でもありません。

例えば、以下のような処理を考えてみます。

# 以下の条件の場合のみ RewriteCond を実行したい場合、どうしますか?
if ( (変数A=1 AND 変数B=2) OR (変数C=3 AND 変数C=4) ) {
    RewriteCond ^$ /readme.html
}

RewriteCond は、上から順番に 何も指定がなければ AND 処理を行います。
上記のように括弧で順番がある場合は、結構、面倒なことになります。

これを環境変数で代替えすれば、案外、すっきりすることがあります。


/var/www/html/.htaccess

RewriteEngine On
#  変数A=1 ?
SetEnvIf VAL_A 1 check_a=1
#  変数B=2 ?
SetEnvIf VAL_B 2 check_b=1
#  変数C=3 ?
SetEnvIf VAL_C 3 check_c=1
#  変数D=4 ?
SetEnvIf VAL_D 4 check_d=1

#  (変数A=1 AND 変数B=2) ?
SetEnvIf check_b !1 check_a=0
#  (変数C=3 AND 変数C=4) ?
SetEnvIf check_d !1 check_c=0

RewriteCond %{ENV:check_a}  1 [OR]
RewriteCond %{ENV:check_c}  1
RewriteRule ^$ /readme.html

RewriteCond だけで実現しようと思うと、結構、面倒くさいことになりますが、SetEnvIf を絡めるとわかりやすくはなりますね。
(これでも Nginxの設定に比べると回りくどいですが・・・。


Apacheとnginxの両方を扱ったことがある方には、ここら辺のApacheのまどろっこしさは嫌になる点ではないでしょうか。

nginxは、後発だけあって、Apacheの悪いところは、引き継がないように設計されているんだと思います。なので、概ね、ほぼ、思ったとおりの動作してくれます。
しかし、Apacheは、何かにつけて条件が付いてきます。ここでの SetEnvでもそうです。 マニュアルも読まずに、普通に これぐらいできるだろう・・・なんてやっていると大はまりしてしまいます。 マニュアルを ちゃんと読まないヤツが悪いんですけどね。気を付けましょ。
ご利用のブラウザは、広告ブロック(AdBlockなど) が適用となっていませんか?
このサイトでは、コンテンツの一部が非表示、あるいは、コメント、お問い合わせの投稿ができない検索ができないことがあります。


関連記事 :

Apacheのキャッシュ(mod_cache、mod_disk_cache)+Wordpressの注意点

ここまでに、Apacheのキャッシュ(mod_cache,mod_disk_cache)について、記事を書いてきました。 Apache ...

Nginx でリダイレクト ( rewrite ) するには

ここまでで、nginx + php-fpm上でWordpressを動作するところまで解説してきました。 CentOS / Sci ...

.htaccessで特定のホストからのアクセスを拒否する

今回は、apacheのアクセス規制です。 ここでの話は、FreeBSDもCentOSも関係なく、apacheの設定です。 一般的に、リダ ...

Nginx + php-fpm でWordpressを動かしてみる

ここまで、nginx + php-fpmのインストールと簡単なセットアップ方法について解説してきました。 CentOS / Sc ...

httpd(apache)をインストールする(CentOS,ScientificLinux編)

さあ、ここまでに、phpとMySQLのインストールを行ってきました。 phpとMySQL、そして、httpd(apache(WEBサーバー)) ...



コメントを投稿 :

お名前 *

メールアドレス *
( メールアドレスが公開されることはありません。)

サイトアドレス

コメント *

* 印の項目は、入力が必要な項目です。




最近投稿の記事

[ 画像提供元 : Amazon ] 先日、1TBのディスクの入れ替え時にバックアップをとろうとディスクコピーを行いました。 その際 ...

Windows で Linux ファイルシステム Ext4 のディスクをマウントするには? Ext3Fsd が、おそらく、最も簡単なツール ...

今回は、Windows で Compass を使ってみました。 Compass とは、 Sass(サス、Syntactica ...

今回は、Anti Adblock を使ってみました。 Anti Adblock とは、 そもそも Adblock という ウェブ ...

デスクトップ環境でない サーバーで、Webページのキャプチャー画像をコマンドで撮る には、wkhtmltoimage, CutyCapt ...


さくらのVPS 全プラン リニューアルです。(石狩(北海道)も選択可)


root権限ありで ¥685 / 月 ~ と非常にリーズナブルな CPU 1(core)の 512 プランから、 最高 CPU 10(core), メモリ 32(GB), SSD容量 800(GB) までとプランが充実。
ディスクは、SSDとHDDの選択が可能になった他、データセンターは人気の東京、石狩(北海道)となりました。

また、どのプランでも好きなOSが選べます
( CentOS, Fedora, Scientific Linux, FreeBSD, Ubutu, Debian )

管理人もおすすめのVPSです。
試用期間がありますから、一度、お試しを!!

詳しくは、http://vps.sakura.ad.jp/さくらのVPSのサイトへ へどうぞ!!

カテゴリ


Serverman@VPS 完全1ヶ月無料 キャンペーン実施中です。


Serverman@VPS 完全1ヶ月無料 キャンペーン実施中です。
最近、スワップにも対応した Serverman@VPS は、かなりリーズナブルかもです。

  • メモリ1GB~2GBのEntryプラン :月額:490円
  • メモリ2MB~4GBのStandardプラン :月額:980円
  • メモリ4GB~8GBのProプラン :月額:1,980円

新規申し込みで1ヶ月間完全無料となるキャンペーンを実施中です。
Serverman@VPSの特徴は、安さとIPv6対応です。また、初期設定費0円もポイントです。

IPv6でちょっと遊んでみたい方には、おすすめかもしれませんね。最低利用期間もありませんから、気に入らないときは即解約もできます。

Serverman@VPSの詳細については、 http://dream.jp/vps/ Serverman@VPSのサイトへへどうぞ。



KVM採用 ConoHa VPSは、時間単位で借りれる便利なVPSです。


ConoHa VPS は、初期設定費0円最低利用期間無し時間単位で清算可能、 さらに、Web APIを使って自動化を図ることもできる便利なVPSです。

海外サーバー設置も可能で、ローカル接続にも対応と、かなり、機能豊富なサーバーです。

新規ユーザ登録で、クーポンもらえますから、まずは、お試しですね。

ConoHa VPSの詳細については、
http://www.conoha.jp/ へどうぞ。

KVM採用 お名前.com VPS(KVM) 2G プラン 初期設定費無料 キャンペーン 実施です。


メモリ2GBプラン CPU:3core、Disk:200GB
月額:1,153円から (初期設定:1,680円0円)

さくらのVPSがリニューアルされてもなんのその。
1GBメモリ / 2Core を ¥834 – の格安価格で提供中です!
間違いなくスペックからすると割安感ありです。
年間割引時の途中解約で返金がないのは、 ちょっと残念ですが、それでもこの割安感は魅力です。

まずは、お試しですね。

お名前.com VPS(KVM)の詳細については、
http://www.onamae-server.com/vps/ へどうぞ。(お試し期間が15日あります。)



  • ソーシャルブックマーク

  • はてなブックマークへ追加するはてな登録数
ページトップへ
Time : 0.2598 [s]