在同一VirtualHost上服务http(端口80)和https(端口443)


29

我需要在Apache上设置我的VirtualHost,以同时在http和https上投放(使用标准端口)

如果启用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>

Answers:


44

您不能在一台虚拟主机中执行此操作,因为Apache需要知道哪个将与SSL通讯,而哪个则不会(注:nginx没有此问题,您可以告诉它哪些侦听指令与SSL相关;我喜欢它的众多原因之一)。

我在Apache中管理此方法的方式是将所有与SSL不相关的所有配置放入一个单独的文件中,然后将两个虚拟主机彼此相邻配置,每个虚拟主机都包括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将SERVER_PORT环境变量设置为443,而不是使用发出请求的端口(取决于80或443)。<IMAGINARY_PARAGRAPH_BREAK>很可惜,因为我希望能够使用它,因为我真的想为每个虚拟主机保留一个文件。<IMAGINARY_PARAGRAPH_BREAK>另外,您还需要在顶部<VirtualHost>中使用ServerName指令,否则将错误地吞噬请求。将其设置为ServerName badhost.bad或其他名称。
Daniel Beardsmore '16

1
@DanielBeardsmore:我刚刚使用RH Software集合中的2.4.18对此进行了测试,这似乎是由于默认的UseCanonicalPhysicalPort Off。如果将其设置为on,您似乎会获得实际使用的端口。(很有趣的是,我不得不SSLEngine On在倍增使用的虚拟主机中放弃了该端口,并将默认端口设置为80。)
Ulrich Schwarz

1
@DanielBeardsmore:FWIW, %{HTTPS}也将正确设置,但%{REQUEST_SCHEME}不是(总是http)。不过,我会很愚蠢地提出针对UseCanonicalRequestScheme指令的功能请求。
Ulrich Schwarz
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.