当我导航到http://example.com
它时,它会正确重定向到https://example.com
。
我遇到的问题是,当我导航到http://example.com/sub/directory/page.htm
它时它会重定向到https://example.comsub/directory/page.htm
。
为什么它没有重定向到https://example.com/sub/directory/page.htm
?
这是 Apache 配置:
<VirtualHost *:80>
ServerName example.com
Redirect permanent / https://example.com/
</VirtualHost>
<IfModule mod_ssl.c>
#NameVirtualHost *:443
<VirtualHost *:443>
ServerName example.com
[...]
ProxyRequests Off
ProxyPass / http://localhost:8444/
ProxyPassReverse / http://localhost:8444/
</VirtualHost>
我使用的 Apache 版本:
Server version: Apache/2.4.18 (Ubuntu)
Server built: 2017-09-18T15:09:02
答案1
您的配置似乎正确:
Redirect permanent / https://example.com/
这Redirect
指令应将 URL 路径后面的所有内容逐字逐句地附加到目标。请求http://example.com/sub/directory/page.htm
确实应该附加 sub/directory/page.htm
到https://example.com/
并重定向到https://example.com/sub/directory/page.htm
您的评论“当我导航至”似乎表明您正在通过网络浏览器进行测试。
这会带来一些与使用现代浏览器相关的潜在问题:
- 浏览器缓存永久重定向因此,您在 Apache 配置中所做的任何更改都不会被采纳,您的网络浏览器将直接转到缓存的目标 URL,而无需先连接到您的网络服务器。
- 大多数支持 TLS 并从 http 重定向到 https 的网站也设置了HTTP 严格传输安全标头。这也会导致您的浏览器不会连接到纯 http 站点,并且会主动将您输入的纯 http URL 重写为 https。
- 不仅在您的 HTTP 网站上,而且在 HTTPS 网站上也可能存在多个(缓存的)重定向和/或重写规则
有时从新的隐身/匿名浏览器窗口进行测试可以避免此类问题,但大多数情况下我只是从命令行进行测试,例如curl -v http://example.com/sub/directory/page.htm