我在 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'
并将加密模式设置为严格最终解决了所有问题。