如何仅在主机上禁用 Apache 上的非 SSL,而不在虚拟主机中禁用?

如何仅在主机上禁用 Apache 上的非 SSL,而不在虚拟主机中禁用?

这是扩展(不是重复)如何在 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>

然后:

  1. 运行a2enconf ssl以启用 SSL。
  2. 运行a2ensite example.com以启用我的域。
  3. 运行a2dissite 000-default以禁用主机默认站点。
  4. 运行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]

相关内容