同一服务器,不同的 Apache 虚拟主机,其中一个重定向不起作用

同一服务器,不同的 Apache 虚拟主机,其中一个重定向不起作用

我的服务器上配置了多个虚拟主机。其中两个应该具有以下行为,以便最终始终重定向到https://www.....

例如我在 URL 栏中输入以下内容:域名1.tld

它会重定向到www.domain1.tld -> 重定向至 ->https://www.domain1.tld

设置看起来像这样...

<VirtualHost *:80>
        ServerName domain1.tld
        Redirect permanent / http://www.domain1.tld
</VirtualHost>

<VirtualHost *:80>
        ServerName www.domain1.tld

    ###### more settings ####

RewriteEngine on
RewriteCond %{SERVER_NAME} =www.domain1.tld
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>  

另一个虚拟主机具有完全相同的配置:

<VirtualHost *:80>
        ServerName domain2.tld
        Redirect permanent / http://www.domain2.tld
</VirtualHost>

<VirtualHost *:80>
        ServerName www.domain2.tld

    #### more settings ####

RewriteEngine on
RewriteCond %{SERVER_NAME} =www.domain2.tld
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>

但这里发生的事情很奇怪。当我进入www.domain2.tld进入 URL 栏,它将被重定向到https://www.domain2.tld成功。但是当我输入域名2.tld进入 URL 栏,它会重定向到https://domain2.tld我得到了默认的“未连接:潜在的安全问题“页面显示错误消息:

Error code: SSL_ERROR_BAD_CERT_DOMAIN

如果我查看证书,它会显示来自我的第三个域配置的证书:子域1.域1.tld。此虚拟主机可以同时存在于 http 和 https 中,因此配置看起来略有不同。它没有重定向:

<VirtualHost *:80>
        ServerName subdomain1.domain1.tld

    ##### more settings ####

</VirtualHost>

但这不应该是问题。问题是:

当我进入域名2.tld进入网址栏,为什么此域名不能正确重定向到HTTPS并获取第三个域名的证书?

另外要说的是: 域2位于另一个域名提供商(指向我的服务器 IP),因此 DNS 设置看起来略有不同(因为选项与我的域 1 提供商上的选项不同)。这可能是 DNS 级别上的问题吗?

域 1 的设置(工作):
域1

对于 domain2,我无法进行这样的设置。相反,设置如下所示:

*.domain2.tld A [IP OF MY SERVER]
ftp.domain2.tld A [IP OF MY SERVER]
domain2.tld A [IP OF MY SERVER]
mail.domain2.tld A [IP OF MY SERVER]

[更新]
我还在这里添加了 domain2.tld 虚拟主机的 SSH 配置。

<IfModule mod_ssl.c>
<VirtualHost *:443>
        ServerName www.domain2.tld

    #### more settings ####

    SSLCertificateFile /etc/letsencrypt/live/www.domain2.tld/fullchain.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/www.domain2.tld/privkey.pem
    Include /etc/letsencrypt/options-ssl-apache.conf
</VirtualHost>
</IfModule>

[更新]
只是为了测试,我完全禁用了域2.tld.conf(即非 https 站点配置)/etc/apache2/sites-enabled(a2dissite)。现在的行为应该是只有 https 版本有效。我甚至重新启动了 apache,但它变得越来越混乱:网站的行为仍然相同。这意味着,当我输入www.domain2.tld进入 URL 栏,网站仍然重定向到https://www.domain2.tld。这怎么可能?!这个重定向从何而来,因为没有更多的活动重写条件?只有符合条件的站点<VirtualHost *:443>才可用。(我清理了浏览器缓存和数据)。

[更新]
现有重定向的困惑在于,每个浏览器都会以某种方式保存重定向信息(尽管它们不应该保存),但我无法通过清除缓存和数据来重置这种愚蠢的行为。我想知道当浏览器一直出现奇怪的事情时,我该如何测试服务器设置。
我也试图缩小问题的范围,但似乎 domain2.tld 的 RewriteRule 和/或 RewriteCond 根本不起作用。这是我当前的 domain2 配置示例:

<VirtualHost *:80>
        ServerAdmin [myself]@gmail.com
        ServerName www.domain2.tld
        ServerAlias domain2.tld *.domain2.tld
        DocumentRoot /var/www/www.domain2.tld
        <Directory />
                Options FollowSymLinks
                AllowOverride None
        </Directory>
        <Directory /var/www/www.domain2.tld/>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride None
                Order allow,deny
                allow from all
        </Directory>

        ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
        <Directory "/usr/lib/cgi-bin">
                AllowOverride None
                Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
                Order allow,deny
                Allow from all
        </Directory>

        ErrorLog ${APACHE_LOG_DIR}/domain2/error.log

        # Possible values include: debug, info, notice, warn, error, crit,
        # alert, emerg.
        LogLevel warn
        CustomLog "|/usr/bin/rotatelogs ${APACHE_LOG_DIR}/domain2/access-%Y-%m-%d.log 86400" combined
        #CustomLog ${APACHE_LOG_DIR}/access.log combined

    Alias /doc/ "/usr/share/doc/"
    <Directory "/usr/share/doc/">
        Options Indexes MultiViews FollowSymLinks
        AllowOverride None
        Order deny,allow
        Deny from all
        Allow from 127.0.0.0/255.0.0.0 ::1/128
    </Directory>

RewriteEngine on
RewriteCond %{SERVER_NAME} =www.domain2.tld
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>

如果我尝试在一个完全不同的网站上使用重写规则,它将被忽略。所以这里肯定有什么地方出了问题。

[更新 + 解决方案]
显然,所有这些混乱(和错误配置)都会发生,因为我使用的所有浏览器都会将这些愚蠢的错误重定向保存在无法摆脱的缓存中(至少在 FF 中,它仍然无法在这里工作,尽管我清除了所有内容)。我会把这个问题作为单独的问题来问。

这两个领域的解决方案就是 Leo 的答案,而且非常简单:

<VirtualHost *:80>
        ServerName domain2.tld
        Redirect permanent / https://www.domain2.tld
</VirtualHost>

<VirtualHost *:80>
        ServerName www.domain2.tld
        Redirect permanent / https://www.domain2.tld
</VirtualHost>

我可以确认这有效,因为我用一个我从未使用过的完全原始浏览器(和设备)测试了它,以调用 domain2.tld。我在另一台设备上用较旧的 Firefox 测试了它,它在那里也能正常工作。结论:我主机上的 Firefox 是唯一无法处理重定向的 Firefox。不知道为什么。具有讽刺意味的是,这个 Firefox 应该是能够最好地处理这个问题的 Firefox,因为我安装了很多反跟踪配置和附加组件,所以每次启动时我都会得到一个“干净的”Firefox。这就是我对此完全困惑的原因。

答案1

据我所知,您正在使用重定向 + 重写进行双重重定向。 没有必要这样做(并且由于您没有发布所有 apache 配置文件,包括 /etc/apache2/conf.d 和 sites-enabled 或等效文件),您可能还缺少设置或某些内容覆盖了 SSL 设置。

例如尝试类似这样的事情。域1.tld.conf

<VirtualHost *:80>
        ServerName domain1.tld
        Redirect permanent / https://www.domain1.tld
</VirtualHost>

<VirtualHost *:80>
        ServerName www.domain1.tld
        Redirect permanent / https://www.domain1.tld
</VirtualHost>  

或者,您甚至可以将其简化为单个 VirtualHost 和单个文件,以便使用别名进行测试:

<VirtualHost *:80>
        ServerName domain1.tld
        ServerAlias www.domain1.tld
        Redirect permanent / https://www.domain1.tld
</VirtualHost>

<IfModule mod_ssl.c>
<VirtualHost *:443>
    ServerName www.domain1.tld


    ....

    SSLEngine On
    SSLCertificateFile /etc/letsencrypt/live/www.domain1.tld/fullchain.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/www.domain1.tld/privkey.pem

    ...

</VirtualHost>
</IfModule>

当然,要实现此功能,您还必须拥有一个可用的 HTTPS VirtualHost,并拥有有效的 SSL 证书,并在 Apache 中启用 SSL 和 Headers 模块(a2enmod ssl, a2enmod headers)。您可能应该检查是否直接连接到网站的 HTTPS 版本。如果 HTTPS 版本无法正常工作,重定向将失败。

关于你的更新的问题关于在端口 80 中删除普通 VirtualHost 的配置后重定向仍然有效,你可能正在遭受 Web 浏览器缓存或类似问题的困扰。如果你想尝试 HTTPS 网站,而不是重定向,只需用整个协议和子域填充 URL https://www.domain1.tld,你也可以使用另一个浏览器(或私人窗口)来完成缓存覆盖。

您应该经常检查/var/log/apache2日志文件,这access.logerror.log有助于调试问题。

相关内容