
次のような仮想ホストを作成したいと思います。
<VirtualHost *:80 *:443>
<IfPort 443>
SSLEngine On
...
</IfPort>
...
</VirtualHost>
したがって、ホストがポート 443 経由でアクセスされた場合、いくつかの追加機能を追加したいと考えています。これを何らかの方法で実現できますか、それともこれを 2 つの仮想ホストに分離する必要がありますか?
答え1
私は、mod_macro
多数の異なるドメインをホストするサーバーでこの問題を解決するために使用しています...モジュールをインストールし (OS/ディストリビューションごとに異なります)、次のように構成します。
LoadModule macro_module libexec/apache22/mod_macro.so
<Macro VHost $host>
<VirtualHost *:80>
DocumentRoot /usr/local/www/$host/data
ServerName $host
ServerAlias *.$host
ScriptAlias /cgi-bin/ "/usr/local/www/$host/cgi-bin/"
IncludeOptional etc/apache22/vhosts/$host
</VirtualHost>
</Macro>
<Macro VHostSSL $host>
<VirtualHost *:80>
DocumentRoot /usr/local/www/$host/data
ServerName $host
ServerAlias *.$host
ScriptAlias /cgi-bin/ "/usr/local/www/$host/cgi-bin/"
IncludeOptional etc/apache22/vhosts/$host
</VirtualHost>
<VirtualHost *:443>
DocumentRoot /usr/local/www/$host/data
ServerName $host
ServerAlias *.$host
SSLEngine on
SSLCertificateFile /usr/local/www/$host/ssl/$host.crt
SSLCertificateKeyFile /usr/local/www/$host/ssl/$host.key
ScriptAlias /cgi-bin/ "/usr/local/www/$host/cgi-bin/"
IncludeOptional etc/apache22/vhosts/$host
</VirtualHost>
</Macro>
Use VHostSSL example.com
Use VHost example.net
新しいドメインを追加するのは非常に簡単です。ドメイン固有の構成はすべてインクルード ファイルに投げ込まれます。
答え2
ジョンの解決策を使用すると、これが得られます
Apache 2 is starting ...
AH00526: Syntax error on line 53 of .../httpd-vhosts.conf:
SSLEngine not allowed here
John が言ったように、最善の方法は 2 つの仮想ホストを持つことです。しかし、私の仮想ホスト コードは 150 行以上 (リバース プロキシが多数) あり、各コードを 2 つ (および非常に長い構成ファイル) 持つことは望まなかったので、最終的に次のようにして機能しました。
1.非SSL仮想ホスト用の仮想ホストを作成します。
2.別の仮想ホストを作成し、最初の仮想ホストへのリバースプロキシを作成します。
<VirtualHost *:443>
SSLEngine on
SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL
SSLCertificateFile "...cert.crt"
SSLCertificateKeyFile "...server.ssl.key"
... (any ssl specific config)
ProxyPreserveHost On
ProxyPass / http://localhost:80/
ProxyPassReverse http://localhost:80/ http://yourdomain.com/
</VirtualHost>
これは決して良い解決策でもパフォーマンスに優しい解決策でもありませんが、2 つの仮想ホストを望まない理由が、すべての仮想ホスト構成の 2 つのバージョンが存在することを防ぐためである場合 (つまり、何かを変更するたびに 2 行を変更する必要がある)、これは機能します。
答え3
重複を避ける別の方法としては、仮想ホストの設定を特定のファイルに保存し、include でそれを取り込むという方法があります。
/etc/path/to/config/example.com.conf
:
ServerName example.com.conf
DocumentRoot /var/www/something
# Any other config you want to apply to both vhosts
仮想ホストファイル:
<VirtualHost *:443>
SSLEngine on
# Other SSL directives
Include /etc/path/to/config/example.com.conf
</VirtualHost>
<VirtualHost *:80>
Include /etc/path/to/config/example.com.conf
</VirtualHost>
答え4
Apacheの構造を見てIf
、リクエストを操作します。If
sのコアドキュメントそして使用可能な表現のリスト次のようなことができます:
<If "%{SERVER_PORT} == '443'">
# Do stuff
</If>
あなたのVirtualHost
タグに関しては、Apache2のドキュメントにそのような解決策が見つかりません。http://httpd.apache.org/docs/2.2/en/vhosts/examples.html#ポートそしてあなたのオプションを試してください:Apache2は異なるポートの代わりに異なるIPに同様のものを使用します(http://httpd.apache.org/docs/2.2/en/vhosts/examples.html#intraextra)。
NameVirtualHost
それでも、2 つの異なる仮想ホストを使用することをお勧めします。これは、はるかに明確です。いずれにしても、ファイルListen
には2 つ必要になりますapache2.conf
。
編集
このソリューションが実際にエラーをスローしていることに気付きませんでしたが、概念自体に戻りましょう... 80 または 443 でリッスンすることは実際には問題ありません。Apache2 は、暗号化がなければ、喜んでエレガントなソリューションを提供します。Apache2 は C で開発され、スレッドとフォーク以外にソケットを使用します。C で SSL を使用するには、OpenSSL コンポーネントの初期化と、SSL 全体を実装するための基本的なソケットの回避策が必要です。簡単なソリューションをお探しですが、背後にあるメカニズム全体が複雑です... これが、基本的な仮想ホストで SSL を有効にできない理由です。HTTP と HTTPs は異なるコンポーネントであり、Apache2 の方法では、最初のコンポーネントと 2 番目のコンポーネントの間に継承の概念がないようです。