我知道很多人以前问过类似的问题:
我如何将 http 重定向到 https(使用 Apache)?/为什么不这样做?
甚至还有一个“代码”片段维基百科重定向到 https 的 HTTP 301 状态代码的页面。
但经过几个小时的搜索,我尝试了许多不同的方法,但只有一种方法有效:
<meta http-equiv="refresh" content="https://example.org">
作为默认页面/var/www/html/index.html
尽管它成功地重定向了,但它不仅丑陋,而且不受搜索引擎的喜爱,并增加了加载时间。
让我们都处于同一水平这 是我的 Apache 配置。我还将 Django 与 Apache 结合使用,以防万一。
以下是我所有尝试的列表:
使用另一个 VirtualHost
<VirtualHost *:80> Redirect permanent / https://example.org/ </VirtualHost>
使用重写将未连接到端口 443 的所有内容重定向到相应的 https 页面:
RewriteEngine On RewriteCond %{SERVER_PORT} !443 RewriteRule ^(/(.*))?$ https://%{HTTP_HOST}/$1 [R=301,L]`
使用维基百科中提到的实现:
RewriteEngine On RewriteCond %{HTTPS} off RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC] RewriteRule ^(.*)$ http://%1/$1 [R=301,L] RewriteCond %{HTTPS} on RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC] RewriteRule ^(.*)$ https://%1/$1 [R=301,L] RewriteEngine On RewriteCond %{SERVER_PORT} 80 RewriteRule ^(.*)$ https://example.org/$1 [R,L]
apache2.conf
我在和文件中都尝试了这些选项(如果有意义的话).htaccess
。显然没有成功。奇怪的是,当我访问 example.org 并在它加载后手动输入 example.org/# 时,最后两种方法有效。我也尝试过只使用 example.org/ 和相同的过程,但没有 #。但那不起作用。
还有什么其他选项(用于 301 重定向)?为什么这不起作用?如果可能的话:我该如何修改它才能使其正常工作?
答案1
第一个重定向应该可以工作,如果不行,不要想太多,因为你根本就没有“进入”那个虚拟主机/服务器/配置,如果你有多个 *:80 虚拟主机,请确保它们都有ServerName
自己名字的指令,否则 Apache 将不知道将请求传递到哪里。要确保你已正确配置虚拟主机,你可以输入:
apachectl -S
...并确保没有虚拟主机具有相同的名称(或没有),否则第一个匹配获胜。
另外,尝试本地连接,直接针对 IP 进行尝试,并使用非缓存浏览器,以确保您看到的是正确的响应而不是缓存的响应,或者您的名称解析指向其他服务器。例如:
curl -I -H"Host:myserver.example.com" http://192.168.1.10/
简而言之,在虚拟主机中这就足够了:
Redirect / https://myserver.example.com/