web-dev-qa-db-ja.com

mod_rewrite-HTTP / HTTPSトラフィックを適切な仮想ホストにリダイレクトする

3つの仮想ホストをホストするDebianで実行されているApache2 Webサーバー(v。2.2.16)があります。最初の2つのホストはHTTPのみです(server1とserver2)。最後のホストはHTTPSのみです(server3)。私の仮想ホスト設定ファイルは Pastebin にあります。 mod rewriteを使用して、次の動作を取得したいと思います。

  • http://server3のリクエストはすべてhttps://server3にリダイレクトされます
  • https://server1またはhttps://server2のいずれかの要求は、必要に応じてhttp://server1またはhttp://server2にリダイレクトされます。

現在、http://server3をリクエストすると、そのホストのインデックス作成が無効になり、https://server1またはhttps://server2のリクエストがhttps://server3(その唯一の仮想ホストとしてSSL)。この動作は望ましくありません。

これまでのところ、中央構成ファイルに書き換えルール(myServerWideConfs.conf)を追加しましたが、残念ながら効果はありません。私は、このルール(または同様のもの)がserver1とserver2のすべてのhttps://リクエストを適切なhttp://リクエストに書き換えるべきだという印象を受けました。

RewriteEngine On
RewriteCond %{HTTP_Host} !^server3 [NC]
RewriteRule (.*) http://%{HTTP_Host}

私の質問は2つあります。

  • これを達成するには、どのmod書き換えルールを使用する必要がありますか?そして、彼らはどこに行くべきですか? DebianのApacheのパッケージ化は、非常にきめ細かい(つまり、破損した)設定ファイルのレイアウトを持っています。書き換えルールが/ etc/Apache2/Apache2.conf/ etc/Apache2/conf.d /myServerWideConfs.conf、または個々の仮想ホストファイル?
  • Modはこれを達成するための適切なツールを書き直しますか、それとも、Apacheのより優れた構成に何か不足していますか?
2
user5596

対処方法:各サイトでvhostsを使用します。これには、抑制したいバリアントのvhostも含まれます。これにより、名前付きサイトのすべての構成が1か所に保持されます。 mod_macroのおかげで、コンテンツの複製は最小限です。

正しいプロトコルを使用して再試行するためにclientを取得することを考えているため、内部的に書き換えるのではなく、リダイレクトを発行する必要があります。 POSTの後のリダイレクトはデータが受け入れられ、Webブラウザで間違ったスキームを使用している人々にのみ本当に対処したいことを意味するため、GETのみを書き換えるようにしてください。APIユーザーは正しいものを使用する必要がありますインタフェース。

そう:

<IfModule mod_rewrite.c>
  <VirtualHost 192.0.2.1:80 [2001:db8::1234:1]:80>
    ServerName www.example.org
    DocumentRoot /www/sites/empty-stub
    RewriteEngine       on
    RewriteCond %{REQUEST_METHOD} =GET
    RewriteRule ^(.*) https://www.example.org$1 [R,L]
  </VirtualHost>
</IfModule>

これを何度も行う場合は、mod_macro <Macro>..</Macro>ブロックでラップして、次のようにします。

Use RedirToHTTPS www.example.org
4
Phil P

これには注意が必要です。これまでは、指定されたIPアドレスへの接続をセットアップするときにSSLがアクセスしようとした仮想ホストを示すことを許可していなかったため、これは不可能でした。これは、TLSの機能である Server Name IndicationRFC 4366 )で多少変更されました。

Apacheは、そのサポートを得るのに長い時間を要しました しかし、現在はそうしています 。お使いのバージョンは十分に新しいので、それをサポートする必要がありますが、それもサポートするブラウザーが必要です。書き換えに取り組む前に、https://server1.example.com/が正しいVHostを返すことを確認する作業に取り掛かります。それができれば、Mod-rewriteのようなものはただ動作するはずです。

0
sysadmin1138