假设我有一个可通过 HTTPS 访问的网站,例如https://example.com/foo
。考虑以下情况.htaccess
:
RewriteBase /
RewriteEngine On
RewriteRule ^foo$ bar [R=301,L]
现在,当我访问 时https://example.com/foo
,它会http://example.com/bar
通过 HTTP 而不是 HTTPS 重定向到 。
RewriteRule
除了使用带有标志的每个完整方案 + 主机之外,我怎样才能使其转到 HTTPS R
?也就是说,这将实现我想要的效果:
RewriteBase /
RewriteEngine On
RewriteRule ^foo$ https://example.com/bar [R=301,L]
但是,我的.htaccess
文件包含许多这样的RewriteRule
s,感觉应该有一种方法可以告诉 Apache/mod_rewrite“https://
默认重写为”。我真正想要的是一条指令来告诉 Apache 该网站正在使用 HTTPS,类似于通过 声明主机名的方式ServerName foo.ext
。这可能吗?
我猜这是 Stack Overflow 上的一个类似问题:如何让 Apache 相信原始客户端协议
答案1
ServerName
也接受方案,例如ServerName https://example.com
。在配置中更改此设置并重新启动 Apache 即可解决问题。
从文档:
有时,服务器会在处理 SSL 的设备(例如反向代理、负载平衡器或 SSL 卸载设备)后面运行。在这种情况下,请
https://
在指令中指定客户端连接的方案和端口号,ServerName
以确保服务器生成正确的自引用 URL。
答案2
这是实现此目的的方法:
RewriteEngine On
#redirect all your http trafic to https exept /foo & /bar
RewriteCond %{HTTP_HOST} ^example.com
RewriteCond %{HTTPS} !=on
RewriteCond %{REQUEST_URI} !(/foo|/bar)
RewriteRule (.*) https://example.com$1 [R=301,L]
#redirect /foo trafic to /bar
RewriteCond %{HTTP_HOST} ^example.com
RewriteCond %{REQUEST_URI} /foo
RewriteRule /foo(.*) http://example.com/bar$1 [R=301,L]
将其放入您的 httpd.conf 中,或放入所有虚拟主机之前,它将应用于以 example.com 开头的所有请求(www.example.com 将不会被重定向)
要将规则应用于所有域,您可以删除以下行RewriteCond %{HTTP_HOST} ^example.com
供参考,您应该尽可能避免使用 .htaccess,以防止无用的硬盘访问。
答案3
您不使用普通的 Rewrite 指令有什么原因吗?
Rewrite / https://example.com/
对于子域名,你可以这样做
Rewrite http://foo.example.com https://foo.example.com