2011-07-20 9 views
12

私はURL書き換えを使用し、特定の.htaccess設定を持つアプリケーションを開発中です。アプリ上で作業しているとき、私は3 eviorments持っている:私のローカルマシン上開発、ステージング、プロダクションの間のアクセス。

  1. Developent(ローカルホスト)を
  2. ステージング(staging.mydomain.com)
  3. 生産(www.mydomain.com)

私は常にステージング環境と運用環境に新しいアップグレードを進めています。既存のソースコードを上書きするたびに、.htaccessファイルを変更する必要があります。 .htaccessをディレクトリにジェネリックにする方法や、それが自動的にその環境を検出する方法はありますか?

私の現在の.htaccessファイルは以下の通りです。私は、異なる環境間のセクションをアンコメントが、それをやって止めるのが大好きだ...

# Development 

RewriteEngine on 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_URI} !=/favicon.ico 
RewriteRule ^(.*)$ /app/index.php?request=$1 [L,QSA] 

# Staging 

# RewriteEngine on 
# RewriteCond %{REQUEST_FILENAME} !-f 
# RewriteCond %{REQUEST_FILENAME} !-d 
# RewriteCond %{REQUEST_URI} !=/favicon.ico 
# RewriteRule ^(.*)$ /html/app/index.php?request=$1 [L,QSA] 

# Production 

# RewriteEngine on 
# RewriteCond %{REQUEST_FILENAME} !-f 
# RewriteCond %{REQUEST_FILENAME} !-d 
# RewriteCond %{REQUEST_URI} !=/favicon.ico 
# RewriteRule ^(.*)$ /index.php?request=$1 [L,QSA] 

感謝を事前に!

チャック

+0

パスが異なるのはなぜですか?/favicon.icoは同じですか? –

+2

私は仮想ホストを設定して、各環境で同じURLを持つようにしています。次に、それらの間で.htaccessを変更する必要はありません。 – Quentin

答えて

13
# Development 

RewriteEngine on 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_URI} !=/favicon.ico 
RewriteCond %{HTTP_HOST} ^localhost 
RewriteRule ^(.*)$ /app/index.php?request=$1 [L,QSA] 

# Staging 

RewriteEngine on 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_URI} !=/favicon.ico 
RewriteCond %{HTTP_HOST} ^staging.mydomain.com 
RewriteRule ^(.*)$ /html/app/index.php?request=$1 [L,QSA] 

# Production 

RewriteEngine on 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_URI} !=/favicon.ico 
RewriteCond %{HTTP_HOST} ^www.mydomain.com 
RewriteRule ^(.*)$ /index.php?request=$1 [L,QSA] 
+0

'%{REQUEST_HOST}'は古くなっていますか?私は、mod_rewriteのマニュアルに相当する '%{HTTP_HOST}'しか見つかりませんでした。 –

+0

@JohnnyWong、そうですね。https://httpd.apache.org/docs/2.0/mod/mod_rewrite.html#rewritecond は、HTTP_HOST' varで答えを更新しました。 他の問題が見つかった場合は、私が考えるように、Apacheを使用していないので自由に編集してください) –

7

1つのオプションは、ご使用の環境を定義することhttpd.conf(または他の場所)に設定環境変数になります。

例えば

httpd.conf中):

SetEnv ENVIRONMENT production 

.htaccess中)

RewriteEngine on 

# Development 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_URI} != /favicon.ico 
RewriteCond %{ENV:ENVIRONMENT} = development 
RewriteRule ^(.*)$ /app/index.php?request=$1 [L,QSA] 

# Staging 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_URI} != /favicon.ico 
RewriteCond %{ENV:ENVIRONMENT} = staging 
RewriteRule ^(.*)$ /html/app/index.php?request=$1 [L,QSA] 

# Production 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_URI} != /favicon.ico 
RewriteCond %{ENV:ENVIRONMENT} = production 
RewriteRule ^(.*)$ /index.php?request=$1 [L,QSA] 

テストされていないが、私は概念が

+0

+1 Apache confにアクセスできない場合は、 URLはです。あなたがホストされたサーバーに別のURLを使うのがより簡単になるようにローカル開発を行います。 – Precastic

0
;-)すべての問題を把握するのに十分な音だと思います

チャックD、Dumitru Cebanの変種はとても良いです。しかし、私はあなたのコードに--htaccesではなく、いくつかのフラグを持つオプションも試してみることをお勧めします。

また、rudi_visserの良い提案です。しかし理想的なシステムでは、apacheの* .confのみを使用し、.htaccess(単に愚かなパフォーマンス)を使用する必要があることをここに追加したいと思います。

コード内にいくつかのフラグを設定し、.htacess(できる場合)とenvを切り替えないようにすることをお勧めします。単純なconf値やロジックなどのようにif locaslhost == host then ...

+0

理想的なシステムのためには、*。confのみを運用に使用できます。 – gaRex

+0

現代システムでの.htaccessのパフォーマンスはもう心配するものではないと私は思います!しかし、とにかく私は、このロジックをコードに入れることは、Apacheがどこにリクエストをルーティングするかを知らないという事実のためにこの状況に役立つとは思わない。 –

+0

@rudi_visserは、.htaccessが本番環境では適切であるかどうかはわかりません。 PHPはフレームワーク内のどのロジックを渡すべきかを知ることができます:使用するtmp/pathesのDB接続。 – gaRex

1

.htaccessファイルを各環境に配置して、使用しているFTPまたはデプロイプログラムのファイルを無視することはできますか?

代わりに、プロダクションサイトと同じドメインで、プレフィックスがdev.のローカルホストには、VirtualHostsが設定されています。たとえば、www.example.comおよびdev.example.comです。そうすることで、環境にかかわらず、私が使用しているホストの最上位のディレクトリであることが常にわかります。私は.htaccessディレクティブを書き直す必要はありません。

関連する問題