SetEnvIfを使用して、Httpホストに基づいて変数を設定するにはどうすればよいですか?


11

Apacheで変数を設定しようとしています

ENV = DEV(httpホストが開発URLの場合)

または

httpホストがprd URLの場合、ENV = PRD

そして、$ _ SERVER ['ENV']を使用して、いくつかの論理ブランチを作成します

これまでのところ、これらのどれも私のために機能しておらず、setenvifモジュールがインストールされています

SetEnvIfNoCase Referer
SetEnvIfNoCase Remote_Host

これを行う正しい方法は何ですか?

回答:


15

ドキュメントをざっと見てみましょう:

SetEnvIfディレクティブは、リクエストの属性に基づいて環境変数を定義します。最初の引数で指定される属性は、次の3つのいずれかです。

HTTP要求ヘッダーフィールド(これらの詳細については、RFC2616を参照)。たとえば、Host、User-Agent、Referer、およびAccept-Languageです。正規表現を使用して、一連の要求ヘッダーを指定できます。

したがって、環境変数をHostヘッダーに条件付きにすることは確かに可能です。RefererまたはRemote_Hostヘッダーを使用しようとしているように見えますが、どちらも必要なものではありません(理論的にRefererはHostほとんどの場合、ヘッダーの値を含める必要があります)。 リクエストを行うクライアントRemote_Hostのホスト名になりますが、これはまったく必要なものではありません(また、パフォーマンス上の理由でDNSルックアップをオフにするのが一般的であるため、ほとんどの構成では使用できません)。

次のようなものを試してください:

SetEnvIf Host "www-dev\.example\.com" ENV=DEV
SetEnvIf Host "www-production\.example\.com" ENV=PRD

...そして$ _SERVER ['ENV']を使用して、いくつかのロジックブランチを作成します

ただしHost、この詐欺を介さずに、PHPでヘッダーの値を直接参照することもできます。$_SERVER['HTTP_HOST']まさにあなたが望むものを持っています。


綺麗な。これにより、特定のホストに接続するときにパスワードを要求するカスタムルールを作成できますが、他のホストには接続できません(つまり、1つのVMが複数のAmazon EC2インスタンスにクローンされるときにステージングボックスを保護しますが、カスタムChefレシピは作成しません)。検索が難しい場合、非常に便利な機能。
— エリックL.

1
SetEnvIfドキュメントは、ドメイン名ではないドットがバックスラッシュでエスケープしなければならない第三paramは、正規表現であると言いますか?または、二重引用符で値を引用すると、Apacheはそれを文字列リテラルとして扱いますか?
— jakub.g

@ jakub.gはい、これらは正規表現であり、エスケープする必要があります。この場合、ドットは任意の1文字に一致するため、"www-dev.example.com"正規表現はなどの予期しないホスト名にも一致しwww-dev-example.comます。予想されるマッチなどが得られます。サンプルを更新しました。
— マルタインHeemels
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.