我有一个虚拟主机指令,如果输入了无效的子域,则会显示自定义 404 错误:
<VirtualHost *:80> # the first virtual host
ServerName site_not_found
RedirectMatch 404 ^/(?!custom_error)
</VirtualHost>
<VirtualHost *:80>
ServerName example.com
ServerAlias ??.example.com
</VirtualHost>
我想设置一个虚拟主机以通过 HTTPS 连接显示相同的自定义错误。我尝试了以下操作:
<VirtualHost *:443> # the first virtual host
ServerName site_not_found
RedirectMatch 404 ^/(?!custom_error)
</VirtualHost>
<VirtualHost *:443>
ServerName example.com
ServerAlias ??.example.com
# SSL options, other options, and stuff defined here.
</VirtualHost>
但服务器无法启动并发出错误:
服务器应支持 SSL,但未配置证书 [提示:SSLCertificateFile] ((null):0)
似乎即使未为此虚拟主机启用 SSLEngine,也需要 SSL 证书。除了提供证书之外,还有其他方法可以解决这个问题吗?关闭模块不是一个选项,因为我需要为虚拟服务器 example.com 使用 SSL。
答案1
看来即使此虚拟主机未启用 SSLEngine,也需要 SSL 证书。除了提供证书外,还有其他方法可以解决这个问题吗?
不 - 当您的浏览器https
在 URL 中包含 时,它希望使用 SSL。如果没有,它将失败。Apache 告诉您这一点是出于善意,否则您将遇到一些难以理解的浏览器错误。因此,您需要在 Apache 中配置 SSL,然后才能使用 port 443
。
如果你不想让浏览器警告你这是一张糟糕的 SSL 证书,你需要从证书颁发机构购买一张。你能免费获得https://cert.startcom.org/这些浏览器在越来越多的地方被接受,但可能没有付费浏览器那么受认可(尤其是在较旧的机器上)。我将其用于我的开发网站,尚未看到关于它们不受信任的警告,但我只使用相对较新的操作系统/浏览器。
答案2
是的,有一种方法:
配置 Apache 的 Listen 指令(在 Ubuntu 上/etc/apache2/ports.conf
)
其中会有类似这样的内容:Listen *:443
您可以通过添加协议来强制执行 HTTP:
Listen *:443 http
这样 Apache2 就可以作为一个简单的 HTTP 服务器监听端口 443
答案3
由于没有任何 SSL 证书而忽略 Apache 错误,除非您创建或购买通配符证书来覆盖“无效”子域,否则您尝试执行的操作是不可能的。
如果您的所有客户端都是内部的,您可以创建一个小型签名机构并在所有机器上安装所有 CA 证书。
如果你的客户是外部的,那么你将必须购买通配符证书,费用约为 600 美元
答案4
我找到了一个简单的重定向解决方案,它可以在您输入后在您的网站虚拟主机内添加一个处理<VirtualHost xxx.xxx.xxx.xxx:80>
...
<VirtualHost xxx.xxx.xxx.xxx:443>
#ServerName www.HttpSiteDomainName.com
#ServerAlias HttpSiteDomainName.com
#DocumentRoot /WhereeverSiteIsOnServer
Redirect 301 / http://www.HttpSiteDomainName.com/
</VirtualHost>
- xxx.xxx.xxx.xxx 是您的网站服务器 IP
- 将“HttpSiteDomainName.com”替换为站点域名和扩展名
- 不要忘记测试并重启你的服务器的 Apache
- 我添加了 #comments 以供参考,但你可以取消注释,它应该仍然可以工作
现在,当您访问该网站的 https 时,它将重定向到 http