所以我希望所有这些都在一台服务器上:
- 3 domains / websites
- SSL on one of them
- nothing to be accessed by an IP address (e.g. 'domain.com' is okay, but not by just typing '123.55.44.123' into the browser)
我在用:
- Ubuntu 12.04 LTS
- Apache
我已经设置了这些虚拟主机,对于非 SSL,一切都运行正常
<VirtualHost *:80>
ServerName 123.55.33.123
DocumentRoot /var/www/random-empty-folder
<Directory />
Options FollowSymLinks
Deny from all # notice the deny here
</Directory>
</VirtualHost>
<VirtualHost *:80>
ServerName www.domain-one.com
ServerAlias domain-one.com *.domain-one.com
DocumentRoot /var/www/domain-one
<Directory />
Options FollowSymLinks
AllowOverride All
</Directory>
</VirtualHost>
<VirtualHost *:80>
ServerName www.domain-two.com
ServerAlias domain-two.com *.domain-two.com
DocumentRoot /var/www/domain-two
<Directory />
Options FollowSymLinks
AllowOverride All
</Directory>
</VirtualHost>
...etc. for 'domain-three'
问题是我无法为 SSL 配置它。我的标准 SSL 设置是这样的,但它允许使用 IP 地址进行访问。我只需要停止它:
<VirtualHost *:443>
ServerName www.domain-two.com:443
ServerAlias domain-two.com *.domain-two.com
DocumentRoot /var/www/domain-two
SSLEngine on
SSLCertificateFile /etc/apache2/ssl/apache.crt
SSLCertificateKeyFile /etc/apache2/ssl/apache.key
<Directory />
Options FollowSymLinks
AllowOverride All
</Directory>
</VirtualHost>
还有一个“default-ssl”站点/文件被禁用,所以不确定我是否应该对此做些什么。我尝试启用它并进行更改,但大多数情况下我遇到的是“默认重复’错误。
因此,基于上述设置,我只需要阻止对 [https]://123.55.44.123 的访问。提前致谢。
我总是在进行更改后运行“service apache2 reload”,以防有人感到疑惑。
答案1
由于请求的域名在 http 标头中(因此当 apache 必须决定使用哪个 vhost 配置时仍然是加密的),apache 使用 IP 和端口来选择使用哪个 SSL vhost 配置,而不是域名。
编辑:
我应该提一下信噪比以及我的答案中的其他几个因素。SNI 是 TLS 的补充,允许服务器在一个 IP/端口组合上使用多个命名虚拟主机配置。但由于您只有一个 *:443 VirtualHost 配置块,因此 apache 将始终选择它。
您想要做的事情是可能的,最简单的方法是激活 default-ssl 作为不针对特定域的请求的捕获器。我不太清楚您在激活 default-ssl 时所说的“默认重复”错误是什么意思,完整的错误消息可能会更有帮助。我建议将符号链接命名为 000-default-ssl,以便首先设置其中的任何选项。
答案2
一个可能的替代方案是,除了阻止访问,如果您将任何到达 IP 地址的请求转发到您的主机名,结果会怎样?这可以通过 htaccess 或 mod_rewrite 来实现。
RewriteEngine On
RewriteCond %{HTTP_HOST} ^123\.55\.33\.123
RewriteRule (.*) http://domain-one.com/$1 [R=301,L]
我认为,由于 SSL 的工作方式(依赖于 IP 地址),您将无法在 apache 级别阻止请求。如果您使用 PHP 或类似程序,则可以使用包含文件来检查 $_SERVER['HTTP_HOST'],如果是您的 IP 地址,则该文件将终止。