Apache 如何阻止没有匹配域名的 https 和 http 访问

Apache 如何阻止没有匹配域名的 https 和 http 访问

以下是我的要求:

  1. 在同一台服务器上托管多个网站。有些网站使用 SSL,有些则不使用。(端口 443 和 80)
  2. 如果域不匹配,则返回 403 或自定义响应

该服务器是使用 Apache 2.4+ 的 Ubuntu LAMP 堆栈。目前我的配置无法正常工作。我已添加默认 VirtualHost,但如果我使用 HTTPS 浏览服务器上没有的域(https://thisisnotasite.com) 它将使我能够转到我希望转到 403 的站点。如果我在 中添加 * 而不是端口 80 default-403.conf,它将始终加载实际站点。使用端口 80,所有 HTTP 请求都会重定向到 403。但是,如果我添加非 SSL 的站点,系统将始终转到那里。在我的apache.conf文件中,我已将虚拟主机的导入行更改为每个文件,因此我可以控制加载顺序。(以下是片段)

#Include the virtual host configurations:
IncludeOptional sites-enabled/default-403.conf
IncludeOptional sites-enabled/Site1.conf
IncludeOptional sites-enabled/SSLSite2.conf
IncludeOptional sites-enabled/SSLSite3.conf
IncludeOptional sites-enabled/Site4.conf

Default-403.conf

<VirtualHost *:80>
        ServerAdmin [email protected]
        ServerName catchAll
        Redirect 403 /
        UseCanonicalName Off
        ErrorLog ${APACHE_LOG_DIR}/catchAllError.log
        CustomLog ${APACHE_LOG_DIR}/catchAll.log combined
</VirtualHost>

Site1.conf

<VirtualHost *:80>
        ServerAdmin webmaster@localhost
        ServerName  site1.com
        ServerAlias www.site1.com

        Redirect permanent "/" "https://www.site3.com/"

        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

SSLSite2(这是一个旧站点,site3 是新站点)

<IfModule mod_ssl.c>
        <VirtualHost *:443>
                ServerAdmin [email protected]
                ServerName  site2.com
                ServerAlias www.site2.com

                Redirect permanent "www.site2.com" "https://www.site3.com/"
                Redirect permanent "site2.com" "https://www.site3.com/"

                ErrorLog ${APACHE_LOG_DIR}/error.log
                CustomLog ${APACHE_LOG_DIR}/site2.log combined

                SSLEngine on

                SSLCertificateFile      /etc/ssl/certs/site2.cert
                SSLCertificateKeyFile /etc/ssl/private/site2.key

                SSLCertificateChainFile /etc/ssl/certs/site2.csr

                <FilesMatch "\.(cgi|shtml|phtml|php)$">
                        SSLOptions +StdEnvVars
                </FilesMatch>

                <Directory /usr/lib/cgi-bin>
                        SSLOptions +StdEnvVars
                </Directory>

                 BrowserMatch "MSIE [2-6]" \
                nokeepalive ssl-unclean-shutdown \
                downgrade-1.0 force-response-1.0
        </VirtualHost>
</IfModule>

SSLSite3

<IfModule mod_ssl.c>
        <VirtualHost *:443>
                ServerAdmin [email protected]
                ServerName  site3.com
                ServerAlias www.site3.com

                DocumentRoot /var/www/html

                ErrorLog ${APACHE_LOG_DIR}/error.log
                CustomLog ${APACHE_LOG_DIR}/access.log combined

                SSLEngine on

                SSLCertificateFile      /etc/ssl/certs/site3.crt
                SSLCertificateKeyFile /etc/ssl/private/site3.key

                SSLCertificateChainFile /etc/ssl/certs/sit3.crt

                <FilesMatch "\.(cgi|shtml|phtml|php)$">
                                SSLOptions +StdEnvVars
                </FilesMatch>
                <Directory /usr/lib/cgi-bin>
                                SSLOptions +StdEnvVars
                </Directory>
                 BrowserMatch "MSIE [2-6]" \
                                nokeepalive ssl-unclean-shutdown \
                                downgrade-1.0 force-response-1.0

        </VirtualHost>
</IfModule>

Site4.conf

<VirtualHost *:80>
        ServerAdmin webmaster@localhost
        ServerName  site4.com
        ServerAlias www.site4.com

        DocumentRoot /var/www/site2

        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

正确答案是,site1 和 site2 不会重定向到 site3,如果我为 site 4 添加导入,那么每个请求都会发送到 site4。如果我将 default-403 更改为 * 而不是端口 80,那么所有内容都会转到 site4。

任何帮助将不胜感激。

请注意,我接触 Apache 仅约 2 个月,因此如果有更好的方法来处理这个问题,请告诉我。

答案1

您需要为 *:80 定义一个“默认”虚拟主机,为 *:443 定义另一个虚拟主机以及一个密钥+证书对,否则您的 SSL 请求将落在第一个定义的 SSL 虚拟主机中,因此在您的默认 SSL 虚拟主机中添加类似这样的内容(这包括拒绝访问而不是重定向的典型方式)以及所有花哨的功能:

<VirtualHost *:443>
        ServerAdmin [email protected]
        ServerName catchAll
        DocumentRoot /path/to/emptydocroot
        UseCanonicalName Off # this is the default not really needed here
                             # unless server config has it set to on

        SSLEngine on
        SSLCertificateKeyFile /path/to/bogus.key
        SSLCertificateFile /path/to/bogus.crt
        ErrorLog ${APACHE_LOG_DIR}/catchAllError-ssl.log
        CustomLog ${APACHE_LOG_DIR}/catchAll-ssl.log combined

        <Directory /path/to/emptydocroot>
              Options none
              AllowOverride none
              Require all denied
       </Directory>
</VirtualHost>

答案2

我很确定 Ubuntu apache2 包在安装时已经创建了默认站点文件。

如果您的服务器上缺少它们,您可以尝试使用虚拟机(例如 VirtualBox 或 Docker)来设置全新安装,以便在您的桌面上使用。

查看 /etc/apache2/site-available(不是 sites-enabled,这只包含指向 site-available 的符号链接。如果站点未激活,则链接将会丢失)。

你应该看到类似这样的内容:

  • 000-default.conf(用于 http / 端口 80)
  • default-ssl.conf(用于 https / 端口 443)

为了激活它们,请使用 a2ensite:

a2ensite default-ssl

加载您的更改:

service apache2 reload

一旦它们被激活,您应该在 /etc/apache2/sites-enabled 中看到它们。

一旦完成工作,您就可以添加 403 的限制。

PS 有时最好在一个干净的系统上从头开始,而不是在它们纠结在一起后尝试修复它们。

答案3

我使用了 ezra-s 和 wirap 两种方法。

在我的解决方案中,我启动了一个新的虚拟机,并将 000-default.conf 和 defualt-ssl.conf 复制到我正在使用的服务器。然后修改 apache2.conf 文件以拒绝目录权限以获取 403 响应并使用默认虚拟主机文件。

谢谢您的帮助!!!

相关内容