在同一个 VirtualHost 上提供 http(端口 80)和 https(端口 443)

kro*_*ron 42 ssl http https virtualhost apache-2.2

我需要在 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>
Run Code Online (Sandbox Code Playgroud)

wom*_*ble 53

你不能在一台虚拟主机上做到这一点,因为 Apache 需要知道哪个会谈论 SSL,哪个不会(旁注:nginx 没有这个问题,你可以告诉它哪些监听指令与 SSL 相关;我喜欢它的众多原因之一)。

我在 Apache 中管理它的方法是将所有与 SSL 无关的配置放在一个单独的文件中,然后将两个 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>
Run Code Online (Sandbox Code Playgroud)


小智 11

这似乎是 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>
Run Code Online (Sandbox Code Playgroud)

  • 这和你对这样一个拼凑物的预期一样有效——几乎,但不完全是!我发现 Apache 2.4.10 将 SERVER_PORT 环境变量设置为 443,而不是使用请求传入的端口(80 或 443,具体取决于)。&lt;IMAGINARY_PARAGRAPH_BREAK&gt; 遗憾的是,我希望能够使用它,因为我真的想为每个虚拟主机保留一个文件。&lt;IMAGINARY_PARAGRAPH_BREAK&gt; 此外,您还需要在顶部 &lt;VirtualHost&gt; 内添加一个 ServerName 指令,否则它会错误地吞噬请求。将其设置为 ServerName badhost.bad 或其他内容。 (2认同)