web-dev-qa-db-ja.com

htaccessはApacheで設定されたサーバー環境変数を読み取ることができますか?

Apache設定でサーバー環境変数を設定すると、組み込み関数を使用してPHPからその変数を読み取ることができます。

しかし、htaccessファイルから変数を読み取ることはできますか?

私がhtaccessで達成しようとしているのは、次のようなものです。

<If var=="stuff">
do things here
</if>

<if var=="different stuff">
do different things here
</if>
13
Tim Jahn

はい、そうです。

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

7
Mike Brant

自宅のローカルホストを自分の仕事の設定とは異なるものとして認識するために同様の設定を行う際に多くの問題が発生したため、これが最終的に行ったことです。

何よりもまず、<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

6
DaveJenni

Apache2.4が導入されました<If><Else><ElseIf>ブロックを新しい式構文と組み合わせて、.htaccessファイルなどでより強力なプログラム制御を実現します。

これはテストされていませんが、表面上は機能します。

<If "%{MY_VAR} == 'my result'">
    …
</If>

出典: https://blogs.Apache.org/httpd/entry/new_in_httpd_2_4

3
Mark Fox

説明と.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番目のステートメントを示します。ハイフンは、視覚的に分離するためのリテラル表示文字です(スペースを入れる方法はないと思います)。

1
George Lerner