大家好,我在运行 Apache 的 Debian 上重定向到 HTTPS 时遇到了一个奇怪的问题。
- 当用户访问http://subdomain.url.nl第一次报告页面未找到。
- 当用户访问 https 时,它可以起作用。
- 然后用户关闭浏览器,再次启动浏览器,并转到 http(不使用 https),重定向突然开始起作用。
我使用这个重写规则。(*隐藏此帖子中的 IP 地址)
<VirtualHost 10.*.*.*:80>
RewriteEngine on
RewriteCond %{SERVER_PORT} !^443$
ReWriteRule ^/(.*) https://%{HTTP_POST}/$1 [NC,R,L]
</VirtualHost>
因此,只有当用户“第一次”通过 http 访问网站时,重定向才有效。有什么办法可以解决这个问题吗?
答案1
变量HTTP_POST
不存在。你很可能指的是HTTP_HOST
:
RewriteEngine on
ReWriteRule ^/(.*) https://%{HTTP_HOST}/$1 [NC,R=301,L]
由于这是永久重定向,因此应返回响应代码 301,默认值为[R]
302(暂时移动)。
还要注意,对 443 以外的端口的条件检查是不必要的,VirtualHost 仅绑定到端口 80。端口 443 上的请求永远不会到达它。
关于第二个请求的工作:您的 SSL 配置中是否启用了 HSTS?这可以解释为什么客户端在后续请求中会立即转到 HTTPS。
答案2
推荐的方式是使用Redirect
虚拟主机内的选项这里解释。这是一个配置片段:
NameVirtualHost *:80
<VirtualHost *:80>
ServerName www.example.com
Redirect permanent / https://secure.example.com/
</VirtualHost>
<VirtualHost _default_:443>
ServerName secure.example.com
DocumentRoot /usr/local/apache2/htdocs
SSLEngine On
# etc...
</VirtualHost>
这会将所有请求重定向http://www.example.com
至https://secure.example.com
。