Apache設定でサーバー環境変数を設定すると、組み込み関数を使用してPHPからその変数を読み取ることができます。
しかし、htaccessファイルから変数を読み取ることはできますか?
私がhtaccessで達成しようとしているのは、次のようなものです。
<If var=="stuff">
do things here
</if>
<if var=="different stuff">
do different things here
</if>
はい、そうです。
Mod_setenvif機能を使用することをお勧めします。そのため、モジュールをオンにする必要があります。
次に、次のようなことを行うだけです。
SetEnvIf Request_URI "\.gif$" image_type=gif
要求されたファイル名がimage_type
で終わる場合、環境変数.gif
に値gif
を設定します。
次に、次のように(RewriteCondのように)これにアクセスできます。
RewriteCond %{ENV:image_type} gif
RewriteRule ^(.*) $.gif
ここで完全なドキュメントを読むことができます: http://httpd.Apache.org/docs/2.2/env.html
自宅のローカルホストを自分の仕事の設定とは異なるものとして認識するために同様の設定を行う際に多くの問題が発生したため、これが最終的に行ったことです。
何よりもまず、<IF ..>
ディレクティブはSetEnvを認識しません。 From http://httpd.Apache.org/docs/current/env.html : "SetEnvディレクティブはリクエスト処理中に遅れて実行されます。つまり、SetEnvIfやRewriteCondなどのディレクティブはで設定された変数を認識しません。それ。"
したがって、可能であればSetEnvIfを使用してみてください。私は怠け者で、これをhttpd.confファイルに入れました。 localhostで実行されていることを確認し(明らかにそうです)、変数を設定します。
SetEnvIf Server_Addr ^127\.0\.0\.1$ home_variable
次に、他の場所で、私のhtaccessファイルにこれがありました:
# IfVersion needs mod_version - you could do an ifmodule before all this i guess
# we use ifversion because If was introduced in Apache 2.4
<IfVersion >= 2.4>
# check if the home variable exists/isn't: empty, "0", "off", "false", or "no"
<If "-T reqenv('home_variable')">
... do home-y stuff
</If>
<Else>
... do work-y stuff
</Else>
</IfVersion>
# fallback
<IfVersion < 2.4>
.. fallback?
</IfVersion>
または、環境ごとに1つの変数を設定して、特定の値を指定することもできます。
SetEnvIf Server_Addr ^127\.0\.0\.1$ check_location=home
次に、first<If ..>
ステートメントを除いて、残りは同じになります。
<If "%{ENV:check_location} == 'home'">....</If>
2.4のホーム環境と2.2のワーク環境の間で両方をテストしました。どちらもmod_versionが有効になっています(したがって、ifmodを気にする必要はありません)。
(私も3つ以上の環境でテストしていませんが、Apache2.4は<ElseIf>
を提供するので、これもオプションです)。
Doop dido。
(-T演算子などの詳細: http://httpd.Apache.org/docs/current/expr.html )
Apache2.4が導入されました<If>
、<Else>
、<ElseIf>
ブロックを新しい式構文と組み合わせて、.htaccessファイルなどでより強力なプログラム制御を実現します。
これはテストされていませんが、表面上は機能します。
<If "%{MY_VAR} == 'my result'">
…
</If>
説明と.htaccessとPHPの例をここに示しました: 。htaccessに環境変数を設定し、PHPで取得します
.htaccessのほんの一部の例として、環境変数レポートを使用するためにPerishable Press 5G Blacklist/Firewall 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は2番目のステートメントを示します。ハイフンは、視覚的に分離するためのリテラル表示文字です(スペースを入れる方法はないと思います)。