Ubuntu 22.04.4下HTTP请求错误重定向至www./,如何配置Apache实现正确的HTTP转HTTPS重定向?
兄弟,你遇到的这个重定向到www./的问题,大概率是Apache配置里的重写规则写错了,导致主机名没有被正确捕获或者替换。咱们一步步来搞定它:
第一步:确认Apache Rewrite模块已启用
首先得确保你开了Apache的重写模块,这是实现URL重定向的基础,如果还没启用,执行下面的命令:
sudo a2enmod rewrite sudo systemctl restart apache2
第二步:修正虚拟主机的重定向规则
打开你在/etc/apache2/sites-enabled/下的站点配置文件,找到80端口的<VirtualHost *:80>块,把里面错误的重定向规则替换成下面的正确配置(选一个符合你需求的方案):
方案1:保留原主机名的HTTPS重定向
如果想让http://example.com跳转到https://example.com,http://www.example.com跳转到https://www.example.com,用这个配置:
<VirtualHost *:80> ServerName example.com ServerAlias www.example.com # 启用重写引擎 RewriteEngine On # 判断当前请求是否为HTTP(非HTTPS) RewriteCond %{HTTPS} off # 重定向到对应的HTTPS地址,保留原请求路径 RewriteRule ^(.*)$ https://%{HTTP_HOST}$1 [L,R=301] </VirtualHost>
方案2:统一重定向到带www的HTTPS
如果想把所有HTTP请求(不管带不带www)都转到https://www.example.com,用这个配置:
<VirtualHost *:80> ServerName example.com ServerAlias www.example.com RewriteEngine On # 先把不带www的HTTP请求转到带www的HTTPS RewriteCond %{HTTP_HOST} ^example\.com$ [NC] RewriteRule ^(.*)$ https://www.example.com$1 [L,R=301] # 再把带www的HTTP请求转到HTTPS RewriteCond %{HTTPS} off RewriteRule ^(.*)$ https://%{HTTP_HOST}$1 [L,R=301] </VirtualHost>
为什么之前会出错?
你之前的配置应该是在重写规则的目标URL里写错了主机名部分,比如误写为https://www./$1,导致生成了www./这种残缺的地址。上面的配置用%{HTTP_HOST}变量自动获取当前请求的主机名,或者直接写完整的目标域名,就不会出现这种问题了。
第三步:验证配置并重启Apache
改完配置后,先检查语法是否正确:
sudo apache2ctl configtest
如果输出Syntax OK,就重启Apache让配置生效:
sudo systemctl restart apache2
第四步:测试重定向效果
可以用curl命令测试,或者直接在浏览器里访问http://你的域名:
curl -I http://example.com
正常情况下会返回301 Moved Permanently,并且Location字段显示正确的HTTPS地址,比如https://example.com/或者https://www.example.com/。
备注:内容来源于stack exchange,提问作者Austin Adkison

