httpd.conf変数:$ {var}と%{var}の違いは何ですか?


7

違いは何である${var}%{var}httpd.confには?

いつどのように使用${}%{}ますか?

http://httpd.apache.org/docs/2.4/configuring.htmlの言及:

定義またはシェル環境変数で定義された変数の値は、構文$ {VAR}を使用して構成ファイルの行で使用できます。

http://httpd.apache.org/docs/2.4/mod/mod_rewrite.html言及:

サーバー変数:これらは%{NAME_OF_VARIABLE}形式の変数です

そして

RewriteMap拡張:これらは$ {mapname:key | default}という形式の拡張です。

ウィル${VAR}(のRewriteCond、するRewriteRuleのようなが、使用RewriteMap命令拡張を除くmod_rewriteのディレクティブの中を除いて、httpd.confでどこでも使用すること${}のように/(.*のRewriteRule ^ / EX)$ {examplemap:$ 1}

SetEnvIfディレクティブを使用してhttpd.confで設定された変数は、同じhttpd.confで使用するため${var}に、変数がmod_rewriteディレクティブで使用される場合を除いて使用され%{var}ますか?

回答:


5

httpd.confの$ {var}と%{var}の違いは何ですか?

ほとんどすべて。「$xを実行する、%yを実行する」という厳格な規則はありません。それらは、どこでどのように使用されるかによって異なることを行うからです。

$ {VAR}は、mod_rewriteディレクティブの場合を除き、httpd.confのすべての場所で使用されます

いいえ-mod_rewrite関連の行であっても、構成全体のすべての場所で${VAR}置換として適用されます。これらは、httpdバイナリに渡されるオプションまたはディレクティブを使用して、起動時にのみ定義できます。-DDefine

これは、これらの変数に:文字を含めることはできませんが、RewriteMap使用法には:文字を含める必要があるためです。これにより、$競合なしで非常に異なる方法でを使用できるようになります。パーサーは:を認識し、それを置き換えることになっていないことを認識しています。

同じhttpd.confで使用するために、SetEnvIfディレクティブを使用してhttpd.confで設定された変数は、変数が%_ {var}として使用されるmod_rewriteディレクティブで使用される場合を除いて、$ {var}として使用されますか?

いいえ。環境変数は、-Dまたはを介して設定される変数と同じではありませんDefine。これらは、SetEnvIf特定のディレクティブのみが使用する、完全に独立した要求ごとのコンテキストです(これらは、設定しているものです)。それらはサポートされている場所で具体的に言及されています-mod_rewriteではサポートされて%{ENV:variable}おり、ログではサポートされて%{variable}eおり、多くのディレクティブには次のようなロジックチェックがありますenv=variable


だから基本的に; これは混乱を招く混乱です。過去数十年にわたるWebサーバーの歴史の証です。おそらくあなたを混乱させる主なものは、mod_rewriteの構文が、構成の他のどの部分にも拡張されないことです。それはすべて異なります。これらすべてから取る主なポイントは、これらすべてを$意味のあるものにする統治的な「ルール」がないということ$です。ある場所でのa は、別の場所でのaとは完全に異なるものを意味します。

いくつかの便利な参照点:

  1. あなたは、Apacheの起動時に、静的変数を設定し、使用するために探している場合Defineと、${VAR}Apacheの起動時に、一回交換します。これは、開発環境と本番環境の間で構成ファイルを共有するような場合に主に役立ちますが、常にを含む$from の使用と混同しないでください。RewriteMap:
  2. 特定のリクエストで変数を操作する場合は、環境変数が目的ですが、特定のディレクティブで使用するときにそれらを取得するために使用する構文について想定することはできません。そのディレクティブのドキュメントを確認する必要があります。
  3. mod_rewriteに問題がある場合は、変数とその構文について知っていると思ったすべてのものを捨ててください。には独自の変数セットがあり%{VAR}、を使用して「通常の」環境変数を取得でき、を使用して環境変数を%{ENV:VAR}設定できます[E=VAR]

うわー!長く書いてくれてありがとう!これを消化するには少し時間がかかります。Apacheのドキュメントがこれを1か所に文書化していないことはかなり奇妙です。
X10

ええ-彼らのドキュメントは特定の概念にとっては悪くありませんが、このような「全体像」はあまり明確ではありません。
シェーンマッデン

1

私はmod_rewriteのソースコードを見て、そのコメントがコメント(do_expand関数)にあることを発見しました:

        /* variable lookup */
        else if (*p == '%') {
        ...
        /* map lookup */
        else {     /* *p == '$' */

したがって、%は正確な変数を表し、$はハッシュテーブル(「マップ」)を検索するためのものです。また、すべてのmod_rewrite拡張は、コアから完全に独立しています-モジュール全体で行われる拡張全体。

私は以前考えられていましたが、それは間違っていました:

$ {}変数はプロジェクトの使用環境であり、構成解析時に評価されます。

%{}変数はリクエストの使用環境であり、リクエストが解析されるときに評価されます。mod_rewriteは%{}シマンティックを使用して、httpdコアによる構成時の補間を防止します。


よろしくお願いします。これの元のドキュメントへのリンクと、可能であればチュートリアルへのリンクを含めてください。
X10

ドキュメンテーションのクリアテキストでそれを見たことはありません。それがなぜそれが行われたのか私が理解している方法です。そしてそれは間違っていました:)
datacompboy
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.