我在 apache 配置中使用以下 mod_rewrite 规则强制所有流量通过 https:
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
当我从同一网络内部访问服务器时,此方法效果很好。当我从外部访问时,不会发生重写,也不会更改为 https。在两种情况下,我都使用相同的 URL 来访问它。
知道为什么会发生这种情况以及可以采取什么措施吗?
编辑:由于我的声誉较低,我尚无法回答我自己的问题,但我发现了这个问题:
解决方案
该服务器需要符合 PCI 标准,因此我身后的防火墙完全阻止了端口 80。这意味着来自外部的请求甚至无法到达进行重写的位置。
这意味着您必须首先请求 https,因为我无法转发它。(也许我可以看看是否可以让防火墙执行此操作,但这是另一个问题。)
答案1
我认为您希望RewriteCond
基于服务器端口:
RewriteEngine On
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://www.example.com/$1 [R,L]
编辑:
尽管如此,你已经确定规则不是问题。
打开你的重写日志在您的 apache 配置文件或 vhost 配置中查看 mod_rewrite 正在做什么。
另外,提供输出iptables -L