13

以前にも同様の質問があったことは知っていますが、自分の状況に対する具体的な答えは見つかりませんでした。

私はExpressionEngineサイトを複数の環境(ローカル、開発、本番)で実行しており、それらの環境ごとに異なる.htaccessルールが必要です。

すべての環境

発達

  • .htpasswdによるパスワード保護
  • HTTPSプロトコルを強制する
  • X-Robots-Tagを使用して検索エンジンのインデックス作成を防止する

製造

  • HTTPSプロトコルを強制する
  • www以外のサブドメインをwwwにリダイレクトする

ローカル

  • 独自のルールはありません。

モジュールごとに特定の環境を設定する方法の例をたくさん見てきました。RewriteCond %{REQUEST_HOST} ^dev.myurl.commod_rewriteモジュールの場合と同様に、 .htpasswd要件の場合はこのようなトリックが必要です。

しかし、私が本当に望んでいるのは、グローバル環境変数を設定し、それらの変数を環境ごとの.htaccessファイルで再利用する方法です。例としてpseudo-javascriptを使用するには、次のようにします。

var local = 'mysite.local';
var development = 'dev.mysite.com';
var production = 'www.mysite.com';

// Global .htaccess rules

if(environment == local){
   // Local environment .htaccess rules
}

if(environment == development){
   // Development environment .htaccess rules
}

if(environment == production){
   //Production envirotnment .htaccess rules
}

このようにして、すべての環境固有のルールがすべてグループ化され、非常にクリーンなファイルが作成されます。環境が変更された場合に変更する必要がある変数は1つだけです。

Apacheの構成ファイルの設定を変更するための参照をいくつか見てきましたが、サードパーティのホストを扱っている場合は、明らかにそれは実行可能なオプションではありません。

それで、この空のパイの希望的な考えですか、それともそれを行うことができますか?

4

2 に答える 2

11

ジョンの答えは良いものです。残念ながら、すべてのWebホストでApacheを起動するための-Dパラメーターを制御できるわけではありません。

開発と本番で単一のhtaccessファイルを使用する方法は次のとおりですが、開発サイトのパスワードのみが保護されています。

# ----------------------------------------------------------------------
# Password protect staging server
# Use one .htaccess file across multiple environments
# (e.g. local, dev, staging, production)
# but only password protect a specific environment.
# ----------------------------------------------------------------------

SetEnvIf Host staging.domain.com passreq
AuthType Basic
AuthName "Password Required"
AuthUserFile /full/path/to/.htpasswd
Require valid-user
Order allow,deny
Allow from all
Deny from env=passreq
Satisfy any
于 2012-10-22T20:20:54.780 に答える
8

それで、この空のパイの希望的な考えですか、それともそれを行うことができますか?

IMO、はい。ENV変数などに基づいて、予測可能なルールの「スコープ」を取得することはできません。if(something) { do everything in here }apacheには恣意的な存在はありません。多くのディレクティブは特定のスコープ内では機能しません。後で、何かの動作を変更する必要がある場合、単に修正するよりも、持っているものを壊す可能性が高くなります。

最善の方法は、htaccessファイルをまったく使用しないことです。

httpdメインサーバーの設定ファイルにアクセスできる場合は、.htaccessファイルを完全に使用しないでください。.htaccessファイルを使用すると、Apachehttpサーバーの速度が低下します。.htaccessファイルに含めることができるディレクティブは、Directoryパフォーマンスが向上しても同じ効果があるため、ブロックに設定する方が適切です。

ローカル、開発、および本番用に個別の仮想ホストを作成します。共有するグローバル構成に関係なく、必要に応じてオンまたはオフにし、それを他の場所(と呼ばれるファイルなど)に保存してから、3つのvhostすべてでディレクティブをglobal.includes使用します。Include特定のディレクトリにルールを適用する必要がある場合は<Directory>、htaccessファイルの代わりにブロックを使用してください。

すべてをhtaccessファイル内に貼り付けたい場合は、すべてブロックに入れてみることができます。これは、質問の擬似コードに最も近いものです。基本的に次のようなものです。<IfDefine>

# Global htaccess rules
RewriteEngine On
RewriteRule ^foo$ /bar [L]

# Only local
<IfDefine LocalInstance>
    RewriteRule ^local/foo /bar [L]
</IfDefine>

# Only dev
<IfDefine DevInstance>
    RewriteRule ^dev/foo /bar [L]
</IfDefine>

# Only production
<IfDefine ProductionInstance>
    RewriteRule ^dev/foo /bar [L]
</IfDefine>

次に、apacheを起動するときに、、、をコマンドラインパラメーターとして渡すか、vhost構成のどこかでディレクティブ(引数を1つだけ)を使用する必要-DLocalInstanceがあります。これは、見た目ほどスムーズに機能することが保証されているわけではありません。特に、凝りすぎた場合は、以前に説明のつかない問題が発生しました。-DDevInstance-DProductionInstanceDefine<IfDefine>

于 2012-10-14T22:28:43.170 に答える