同じVirtualHostでhttp(ポート80)とhttps(ポート443)を提供する


29

httpとhttpsの両方で機能するようにApacheでVirtualHostをセットアップする必要があります(標準ポートを使用)

SSLエンジンを有効にした場合(以下を参照)-ポート80でエラーが発生します。

その理由は、サイトの一部はSSLである必要があるが、他の部分はそうではないということです。サイトでhttpとhttpsの両方を提供するにはどうすればよいですか?

これが私の仮想ホストファイルです。

NameVirtualHost *

<VirtualHost *>
        ServerAdmin webmaster@localhost
        ServerName mysite.co.uk
        DocumentRoot /var/www/mysite/public
        <Directory />
                Options FollowSymLinks
                AllowOverride None
        </Directory>
        <Directory /var/www/mysite/public>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride All
                Order allow,deny
                allow from all
        </Directory>

        ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
        <Directory "/usr/lib/cgi-bin">
                AllowOverride None
                Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
                Order allow,deny
                Allow from all
        </Directory>

        ErrorLog /var/log/apache2/error.log

        # Possible values include: debug, info, notice, warn, error, crit,
        # alert, emerg.
        LogLevel warn

        CustomLog /var/log/apache2/access.log combined
        ServerSignature On

    Alias /doc/ "/usr/share/doc/"
    <Directory "/usr/share/doc/">
        Options Indexes MultiViews FollowSymLinks
        AllowOverride None
        Order deny,allow
        Deny from all
        Allow from 127.0.0.0/255.0.0.0 ::1/128
    </Directory>

     #SSL STUFF...
      SSLEngine on
      SSLCertificateFile /etc/apache2/crts/mysite.crt
      SSLCertificateKeyFile /etc/apache2/crts/mysite.key
      SSLCertificateChainFile /etc/apache2/crts/DigiCertCA.crt


</VirtualHost>

回答:


44

Apacheは、どのホストがSSLを使用し、どのホストがSSLを使用しないかを知る必要があるため、1つの仮想ホストでこれを行うことはできません(注意:nginxにはこの問題はありません。好きな理由の1つです)。

Apacheでこれを管理する方法は、すべての非SSL関連の構成を個別のファイルに配置し、次に2つのvhostを互いに隣接して構成し、それぞれに次のようにvhostスタンザ内のサイト固有の構成ファイルを含めることです:

<VirtualHost 192.0.2.12:80>
    Include /etc/apache2/sites/example.com
</VirtualHost>

<VirtualHost 192.0.2.12:443>
    SSLEngine On
    # etc
    Include /etc/apache2/sites/example.com
</VirtualHost>

7

これはApache vHostの問題のように見えますが、設定を繰り返すことなくジョブを実行します。

SSLCertificateFile /srv/.ssl/self/server.crt
SSLCertificateKeyFile /srv/.ssl/self/server.pem

# REQUIRED
<VirtualHost *:80>
    DocumentRoot /srv/www/badhost
</VirtualHost>

<VirtualHost *:80 *:443>
    SSLEngine On
    ServerName example.com
    ServerAlias www.example.com
    DocumentRoot /srv/www/example.www
</VirtualHost>

それは本当に奇妙ですが、存在します!
user77376

1
これは、あなたがそのような手品から期待するかもしれないのと同じように働きました-ほとんど、しかし完全ではありません!Apache 2.4.10は、リクエストが入ったポート(80または443に依存)を使用する代わりに、SERVER_PORT環境変数を443に設定することがわかりました。<IMAGINARY_PARAGRAPH_BREAK>仮想ホストごとに1つのファイルを保持したかったため、これを使用できることを望んでいたので、残念です。<IMAGINARY_PARAGRAPH_BREAK>また、最上位の<VirtualHost>内にServerNameディレクティブが必要になります。そうしないと、誤ってリクエストを飲み込んでしまいます。ServerName badhost.badなどに設定します。
ダニエルビアズモア

1
@DanielBeardsmore:これをRH Softwareコレクションの2.4.18でテストしましたが、これはデフォルトのが原因のようですUseCanonicalPhysicalPort Off。オンに設定すると、実際のポートが使用されているように見えます。(おもしろいことSSLEngine Onに、二重に使用するvhostをオフにして、デフォルトとしてポート80を取得する必要がありました。)
Ulrich Schwarz

1
@DanielBeardsmore:FWIW %{HTTPS}も正しく設定されますが、そうで%{REQUEST_SCHEME}はありません(常にhttp)。UseCanonicalRequestSchemeただし、ディレクティブの機能リクエストを入力するのはばかげていると感じます。
ウルリッヒ・シュワルツ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.