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

我需要在Apache上设置我的VirtualHost服务于httphttps(使用标准端口)

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

你不能在一个虚拟主机上这样做,因为Apache需要知道哪一个会说SSL,哪一个不是(注意:nginx没有这个问题,你可以告诉它哪个listen指令与SSL相关;我喜欢它的原因之一)。

我在Apache中pipe理的方式是将所有与SSL无关的configuration放入一个单独的文件中,然后将两个vhostconfiguration为彼此相邻,每个vhost包含vhost节中的特定于站点的configuration文件,如下所示:

 <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> 

这似乎是Apache vHost中的一个问题,但它不需要重复configuration即可完成这项工作。

 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>