Apache 虚拟主机端口 443 提供来自端口 80 配置的内容

Apache 虚拟主机端口 443 提供来自端口 80 配置的内容

我在 Ubuntu Server 22.04 上运行 Apache 2.4.52。我尝试通过端口 443 运行 https,最终目标是从端口 80 重定向以强制使用 https 上的内容。但是,尽管浏览器连接到 https url 并获得了正确的 SSL 证书,但 Apache 似乎正在使用端口 80 配置中的 DocumentRoot。

例如:

<VirtualHost *:80>

        ServerName [mydomain]
        ServerAlias [www.mydomain]
        DocumentRoot /var/www/testpage1/

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

        #RewriteEngine On
        #RewriteCond %{HTTPS} off
        #RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI}
        #Redirect permanent / https://[mydomain]

</VirtualHost>

<VirtualHost *:443>

        ServerName [mydomain]
        ServerAlias [www.mydomain]
        DocumentRoot /var/www/testpage2/
        
        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined

        SSLEngine on
        SSLCertificateFile /etc/letsencrypt/live/[mydomain]/fullchain.pem
        SSLCertificateKeyFile /etc/letsencrypt/live/[mydomain]/privkey.pem

</VirtualHost>

结果是显示来自“/var/www/testpage1/”的index.html而不是testpage2。


此时,如果我取消注释

#RewriteEngine On
#RewriteCond %{HTTPS} off
#RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI}

或者

#RewriteEngine On
#Redirect permanent / https://[mydomain]

它只是给我一个“ERR_TOO_MANY_REDIRECTS”

如果我注释掉端口 80 配置中的 DocumentRoot,则 http 和 https url 都会将我带到 apache 默认配置页面。

如果我在 80 或 443 配置中注释掉 ServerName 和 ServerAlias,它们仍然会将我带到 testpage1。


/etc/apache2/ 中的 ports.conf 如下所示:

Listen 80

<IfModule ssl_module>
        Listen 443
</IfModule>

<IfModule mod_gnutls.c>
        Listen 443
</IfModule>

我已检查 ssl 模块是否已打开

在 Apache 错误日志中,有一条 AH01909“服务器证书不包含与服务器名称匹配的 ID”警告。这可能是个问题,还是我遗漏了其他内容?

谢谢你的帮助。

答案1

尽管这看起来很愚蠢,但经过数周的头痛之后,结果发现我只是不允许 HTTPS 流量通过我的防火墙。

当我通过 Cloudflare 代理我的网站时,我认为正确的 SSL 证书实际上是 Cloudflare Edge 证书。由于 SSL/TLS 加密模式不是严格模式,Cloudflare 从我的服务器请求的网站仍然通过端口 80 提供服务,但我的浏览器和 Cloudflare 之间的流量仍然是加密的,因此它仍然在我的浏览器上显示为 https。

sudo ufw allow 'Apache Full'并将加密模式设置为严格最终解决了所有问题。

相关内容