这是扩展(不是重复)如何在 Apache 2.2 上禁用非 SSL 连接
与上述问题类似,我也有:
添加了带有 SSL 证书的虚拟主机配置 /etc/apache2/sites-available/example.com.conf。
<IfModule mod_ssl.c>
<VirtualHost example.com:443>
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
SSLEngine on
SSLCertificateFile /my/certs/mydomain.com.cert
SSLCertificateKeyFile /my/certs/mydomain.com.key
SSLCACertificateFile /my/certs/myprovider.ca
<FilesMatch "\.(cgi|shtml|phtml|php)$">
SSLOptions +StdEnvVars
</FilesMatch>
<Directory /usr/lib/cgi-bin>
SSLOptions +StdEnvVars
</Directory>
</VirtualHost>
</IfModule>
然后:
- 运行
a2enconf ssl
以启用 SSL。 - 运行
a2ensite example.com
以启用我的域。 - 运行
a2dissite 000-default
以禁用主机默认站点。 - 运行
a2dissite default-ssl
以禁用主机默认 ssl 站点。
剩下的应该只是网站https://example.com/
不过我也可以访问http://example.com/(非 SSL),这是意料之外的特征。
另一个问题的答案是简单地通过注释掉来禁用端口 80,Listen 80
但这意味着其他虚拟主机将无法指定端口 80。
为什么在没有虚拟主机指定端口 80 的情况下 Apache2 似乎接受端口 80,并且在不完全禁用端口 80 的情况下正确的方法是什么?
答案1
这几乎是一个答案,因为它不会意外地泄露端口 80 的信息:
在 /etc/apache2/sites-available/forbidipaccess.conf 中创建一个文件,内容如下:
NameVirtualHost *:80
<VirtualHost *:80>
<Location />
Order deny,allow
Deny from all
</Location>
</VirtualHost>
sudo a2ensite forbidipaccess
然后 运行:
sudo service apache2 reload
这不会阻止 IP,但403 Forbidden
如果没有以该特定域名作为其 ServerName 或 ServerAlias 的配置,它就会发出响应。
如果我们想要超级友好,并且不喜欢“禁止”消息,我们可以选择使用 Apache Rewrite 返回 301/2/3,将用户转发到等效的 SSL,例如
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{SERVER_NAME}/%$1 [R=301,L]