我购买了对 www.example.com 和 example.com 都有效的证书。我的服务器只能使用“www.example.com”(ssl 工作正常),但当我在浏览器上输入“example.com”时,它什么也不显示。这是我的 apache 文件配置,基本上是两次相同的虚拟主机,但服务器名称不同
Define APACHE_LOG_DIR /var/log/apache2
Define SSLCERTIFICATE /etc/apache2/ssl/mycertificate.crt
Define SSLKEY /etc/apache2/ssl/mykey.key
<IfModule mod_ssl.c>
<VirtualHost *:443>
ServerAdmin [email protected]
ServerName www.example.com
DocumentRoot /var/www/site2/
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
SSLEngine on
SSLCertificateFile ${SSLCERTIFICATE}
SSLCertificateKeyFile ${SSLKEY}
<FilesMatch "\.(cgi|shtml|phtml|php)$">
SSLOptions +StdEnvVars
</FilesMatch>
<Directory /usr/lib/cgi-bin>
SSLOptions +StdEnvVars
</Directory>
<Directory />
Options FollowSymLinks
AllowOverride All
</Directory>
<Directory "/var/www/site2">
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Order Allow,Deny
Allow from all
</Directory>
BrowserMatch "MSIE [2-6]" \
nokeepalive ssl-unclean-shutdown \
downgrade-1.0 force-response-1.0
# MSIE 7 and newer should be able to use keepalive
BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown
</VirtualHost>
# Same documetn root for example.com (without www)
<VirtualHost *:443>
ServerAdmin [email protected]
ServerName example.com
DocumentRoot /var/www/site2/
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
SSLEngine on
SSLCertificateFile ${SSLCERTIFICATE}
SSLCertificateKeyFile ${SSLKEY}
<FilesMatch "\.(cgi|shtml|phtml|php)$">
SSLOptions +StdEnvVars
</FilesMatch>
<Directory /usr/lib/cgi-bin>
SSLOptions +StdEnvVars
</Directory>
<Directory />
Options FollowSymLinks
AllowOverride All
</Directory>
<Directory "/var/www/site2">
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Order Allow,Deny
Allow from all
</Directory>
BrowserMatch "MSIE [2-6]" nokeepalive ssl-unclean-shutdown downgrade-1.0 force-response-1.0
# MSIE 7 and newer should be able to use keepalive
BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown
</VirtualHost>
</IfModule>
附加信息:
- 我的网站托管在 Azure 的虚拟机中(Ubuntu 14.04 LTS)
- 域名来自 goDaddy
- 还有另一个用于 http (端口 80) 的配置文件
答案1
example.com
由于您的证书对和均有效www.example.com
,并且两个域都配置为使用相同的目录,因此我认为没有理由将它们作为单独的 VirtualHost。我将删除第二个 VirtualHost,并将第一个 VirtualHost 更改为如下所示:
<VirtualHost *:443>
ServerAdmin [email protected]
ServerName www.example.com
ServerAlias example.com
[the rest of the config should look the same as it does in your post]
</VirtualHost>
答案2
您之所以看不到不带 www 的版本,是因为您在 IP 中使用了两个通配符,*:443
并且使用了两个不同的域名。Apache 只会使用第一个通配符来使用证书。摘自 Apache 文档[1]:
在 SSL 上使用命名虚拟主机的问题在于,命名虚拟主机依赖于知道请求的主机名,并且在建立 SSL 连接之前无法读取请求。因此,通常的行为是使用接收连接的地址的默认虚拟主机中的配置来设置 SSL 连接。
要使用通配符,您需要每个证书一个 IP。Apache 将使用每个虚拟 IP 来重定向传入的 SSL 加密请求。为此:
- 为接口添加虚拟 IP(如果我们假设它是 eth0,则为其添加别名)
- 更新文件
ports.conf
,添加两个条目:- 名称VirtualHost IP1:443
- 名称VirtualHost IP2:443
更新你的 vHost 如下:
带有 www 的站点
ServerName www.site.com不带 www 的
站点 服务器名称 site.com
编辑
您还可以将所有传入点击从“site.com”重定向到“www.site.com”。为此,请删除 vHostsite.com
并添加以下行:ServerAlias site.com
这样做将指示 Apache 对两个域使用相同的 vHost。如果您想重定向所有传入的点击(http://example.com, 和http://www.example.com)到主安全域(https://www.example.com),考虑添加以下指令:
RewriteEngine On
RewriteCond %{HTTPS} off
# Don't put www. here. If it is already there it will be included, if not
# the subsequent rule will catch it.
RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule .* https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
根据 Serverfault 规则,site.com 被 example.com 取代
答案3
由于您想使用 SNI,因此必须启用它。检查
名称虚拟主机 *:443
在你的配置中某处可用
不过我觉得最好还是加一个serverAlias,并且要和root目录一样,可以通过mod_rewrite来选择不同。
答案4
最后我通过这样做珍妮D建议并从 重定向mypage.com
到www.mypage.com
并更改 goDaddy 配置(我的域名所在位置)中的“www”CName 以指向我的 azure VM 地址。
因此,在这种情况下,既不需要修改 .htaccess,也不需要使用 SNI。不确定这是否是最佳或理想的配置,但至少是可行的。