15

私の開発セットアップ: Mac OSX 10.7.4 / Apache 2.2.21 / PHP 5.3.10

開発環境とライブ環境に応じて、.htaccess ファイルに条件付きロジックを追加したいと考えています。たとえば、開発サーバーではなく、ライブサーバーで認証を行いたいとします。私はhttpd.confに持っています

SetEnv DEV 1

この var が設定されていることは、 phpinfo()の出力を確認して確認しました。次に、私の.htaccessファイルに

<IfDefine !DEV>
  AuthType Basic
  AuthName "password protected"
  AuthUserFile /path/to/.htpasswd
  Require valid-user
</IfDefine>

...しかし、ローカル dev ではまだパスワードの入力を求められます。でDEV変数を使用できないようです.htaccess。私は自分のドキュメントルートにAllowOverride All設定しました。httpd.conf何か案は?

4

6 に答える 6

22

私はこの問題に約 4 時間取り組んだばかりで、最終的な答えを持っていると信じており、この特に苦痛な問題を解決する方法をすべての人に要約することができます.

Windows 7 Home Premium と Apache 2.2x および Php 5.3 を開発マシンとして使用しています。私もDEV環境変数が必要です。これを .htaccess ファイルで使用して、開発環境では有効ではないが本番環境には重要な Rewriting やその他のディレクティブをオフにできます。

私の .htaccess ファイルは次のようになります。

<IfDefine !__DEV__>
    AddType application/x-httpd-php53 .php
</IfDefine>

HostGator から、php 5.3 を使用するには、このように htaccess ファイルを変更して有効にする必要があると通知されました。そうしないと、php 5.2 しか使用できません。しかし、私はすでに開発マシンにそれを持っているので、ローカルで表示すると、このディレクティブが原因で顧客の Web サイトがクラッシュしていました。これから説明するすべてのことにより、1 つの .htaccess ファイルを Git リポジトリに保持することができました。これは両方の場所で機能します。

まず、この問題を解決するために IfDefine と SetEnv を使用する方法をインターネットで探しているときに学んだすべてのことを明確/要約させてください。

  1. Apache の IfDefine ディレクティブ Only 、 ONLY は、コマンド ラインで渡されたパラメーターに応答します。それを少し強調させてください。コマンドラインのみ!
  2. SetEnv と SetEnvIf は、2 つのまったく異なるものです。1 つ (SetEnv) は conf ファイルで使用するためのもので、SERVER START TIME に設定される環境変数 (apache に固有) を設定します。SetEnfIf は REQUEST TIME に使用され、REQUEST 変数に基づいて何を設定するかを決定するためにのみ使用されます。
  3. IfDefine ディレクティブは、SetEnv または SetEnvIf によって設定された変数を読み取りません。限目。議論も、質問も、「しかし、私は思った...」もありません。そうではないので、それを乗り越えてください。

簡単な答えは NO です。httpd.conf で「SetEnv DEV 1」を使用してから、IfDefine を使用して .htaccess ファイルでそれを検出することはできません。これは、プログラミング ロジックの構文と性質に基づいて、直感的で合理的に思われます。私たちの慣れています。実際には何もプログラミングしていないことを思い出してください。これらは構成ファイルであり、もちろん、そうすべきだと思われるという理由だけで、この期待に準拠していません。

答え

つまり、起動パラメーターを Apache に追加する方法を理解する必要があるということです。Linux の連中にとっては、その答えはすぐに見つかります。適切なものをenvvarsファイルに追加するだけでよいのですが、貧しいWindowsジャンキーはどうすればよいでしょうか。 ?

Windows ユーザーにとっては、次の理由でより楽しくなります。

  1. Windows では、Apache2.2 のサービス構成に起動パラメーターを永続的に追加することはできません (機能しません。試してはいけません。何百万回も実行していますが、信じてください)。これは本当です。そこに行って独自のパラメーターを入力しようとすると、一度しか機能せず、次にダイアログを開いたときにパラメーター フィールドが空になります。なぜそうなのかはわかりませんが、これらのパラメーターはテスト用であり、恒久的な変更ではないようです。
  2. Apache をインストールすると、スタート メニューに「開始」、「停止」、および「再起動」のショートカットが作成され、Apache Services Monitor がインストールされます。ただし、スタート メニューのショートカットは、Apache サービス モニターで使用されるものとは異なる起動パラメータを使用します。したがって、これらの方法の組み合わせを使用して apache を開始/停止すると、使用した方法に応じて異なる結果が得られます。ただし、スタート メニューのショートカットに -D "__DEV__" を入れると機能します。

それを解決する手順

.htaccess ファイルで IfDefine を使用して参照できる __DEV__ 環境変数を永続的かつ普遍的に設定するには、Windows 開発環境で、サービスまたはスタート メニューのショートカットを使用して Apache を起動するか、NET START/STOP を使用して NET START/STOP を使用して起動しても機能します。コマンド ラインで、次の操作を行います。

  1. スタート メニューのショートカットのプロパティを開き、そこで Apache を起動するためのコマンドを抽出します。私はそうでした。"C:\Program Files (x86)\Apache Software Foundation\Apache2.2\bin\httpd.exe" -w -n "Apache2.2" -k start

  2. これを変更して、新しい -D __DEV__ 変数を含めます。この変数は、httpd.exe の直後の先頭に配置する必要があります。"C:\Program Files (x86)\Apache Software Foundation\Apache2.2\bin\httpd.exe" -D "__DEV__" -w -n "Apache2.2" -k start

  3. スタート メニューのショートカットは、dev 変数が配置された状態で apache を起動します。

  4. コマンドラインに移動します (管理者として)

  5. タイプ: net stop apache2.2 (または apache のサービス名は何でも)

  6. ここで、上記のスタート メニューのショートカットで使用されているのと同じコマンドをコマンド ラインに入力 (またはコピー アンド ペースト) しますが、次のように変更します。"C:\Program Files (x86)\Apache Software Foundation\Apache2.2\bin\httpd.exe" -D "__DEV__" -w -n "Apache2.2" -k config

  7. startという単語がconfigに変わっていることに注意してください。この魔法のコマンドが行うことは、画面に表示されている設定を、Windows のサービスに保存されている設定に保存することです。Enterキーを押します。この時点から、サービスを開始するか、Apache Services Monitor がサービスを開始するか、Windows がサービスを開始するたびに、変数が渡されます。

小説で申し訳ありませんが、このすべての情報を要約して説明することで、他の疲れた魂が助けてくれることを願っています。:D

于 2012-09-07T18:13:47.403 に答える
6

私の最初の答えに対する別のオプションは、Allow ディレクティブを使用することです。

見てください: http://httpd.apache.org/docs/2.2/mod/mod_authz_host.html#allow

Order deny,allow
Deny from all
AuthType Basic
AuthName "password protected"
AuthUserFile /path/to/.htpasswd
Require valid-user
Allow from env=DEV
Satisfy Any

これは、値ではなく DEV が存在するかどうかのみをチェックします。これが apache の仕組みです。"Allow" を "Allow from 127.0.0.1" に置き換えて (または追加して)、localhost を常に開発モードにします。

これは、パスワードまたは 127.0.0.1 からの条件のいずれかが受け入れられることを示しています。ローカルホストで開発する場合は、127.0.0.1 を使用するか、それを開発する任意の IP に置き換えることができます。これは何もラップする必要はなく、htaccess ファイルに配置するだけです。私は仮想ホストを使用しているので、そこに配置します。

ソース (元のコードに見えるように変更しました): http://www.askapache.com/htaccess/apache-authentication-in-htaccess.html#allow-conditional

于 2012-06-27T06:07:33.280 に答える
4

2年経ちますが、私も同様の問題を抱えています。具体的には、AWS OpsWorks スタックに自動デプロイしており、.htpasswd ファイル (開発中に作業をわかりにくくするために使用される) の配置を制御することはできません。

私たちの最終的な実用的なソリューションは、これに沿ったものでした (Apache 2.2.25):

# check the host against a regex, defining env=DEV if it matches
# this guy matches localhost, dev.project and 10.1.X.X
SetEnvIfNoCase Host "^(localhost|dev\.project|10\.1(\.\d+){2})$" DEV

AuthType Basic
AuthName "Restricted"

# auth file location, in our case defined by an AWS OpsWorks auto-deployment
# this only gets loaded if the regex above doesn't match, which is handy
AuthUserFile /srv/www/project/current/.htpasswd 

Require valid-user
Satisfy    any
Order      deny,allow
Deny from all
Allow from env=DEV

このソリューションは柔軟性に優れているため、複数の開発環境にアクセスしながら、他の任意の数の認証チェックを行うことができます。git commit の前に htaccess を無視または編集する必要はありません。環境変数はやり過ぎに思えるかもしれませんが、正規表現を許可し、他の場所でも使用できます。

参照: http://httpd.apache.org/docs/2.2/howto/access.html

于 2014-04-01T20:34:54.680 に答える
2

Debian/Ubuntu のソリューション:

1/etc/apache2/envarsつは変更する必要があります:

## If you would like to pass arguments to the web server, add them below
## to the APACHE_ARGUMENTS environment.
#export APACHE_ARGUMENTS=''

## If you would like to pass arguments to the web server, add them below
## to the APACHE_ARGUMENTS environment.
export APACHE_ARGUMENTS='-D __DEV__'

これで使用できます

<IfDefine !__DEV__>
    ...
</IfDefine>
于 2014-04-25T20:14:17.040 に答える
1

私は質問に答えるのが大好きですが、簡単なグーグル検索であなたの答えが得られました. Apache のドキュメントを確認してください: http://httpd.apache.org/docs/2.0/mod/core.html#ifdefine

このIfDefineディレクティブは「パラメータ名」のみをテストでき、「パラメータ名」は起動時に httpd によって設定される変数です。

また、このサイトをチェックして、表までスクロールします: http://turboflash.wordpress.com/2010/05/27/apache-environment-variables-visibility-with-setenv-setenvif-and-rewriterule-directives/

次のように開発ウェブサーバーを起動するだけで、あなたが求めていることはまだ可能です:

$ httpd -DDEV

これにより、変数が定義されますDEV。何も設定する必要はないことに注意してください。定義されているということは、基本的に 1/true に設定することです。存在しない場合は、false/0/null/etc に設定されているようなものです...

于 2012-06-27T05:53:24.277 に答える