Jon 提供的技巧是一个很好的技巧,但如果你想使用更多的条件,我担心它可能会破坏[OR]
,如果你使用更多的反向引用,你必须小心使用哪个数字(%1
或%2
或..)。
我认为智能 HTTP/HTTPS 处理最优雅、健壮和干净的解决方案是设置一个变量:
# initialization code - put only once at the beginning of .htaccess
RewriteCond %{HTTPS} =on
RewriteRule ^(.*)$ - [env=proto:https]
RewriteCond %{HTTPS} !=on
RewriteRule ^(.*)$ - [env=proto:http]
# simply use %{ENV:proto} in your rules:
RewriteCond %{HTTP_HOST} ^sub.domain.com$ [NC]
RewriteRule ^ %{ENV:proto}://sub.domain.com:2368%{REQUEST_URI} [P,QSA,L]
优点还在于初始化代码只需要运行一次,所以如果你有更多的重写规则,那么生成的代码会更短更优雅。
请注意,常见的设置是 cloudflare 提供的 https,在这种情况下 HTTPS 在服务器本身上不是“开启”的。在这种情况下,您需要额外的规则,例如(注意顺序):
RewriteCond %{HTTP:CF-Visitor} '"scheme":"http"' [OR]
RewriteCond %{HTTPS} !=on
RewriteRule ^(.*)$ - [env=proto:http]
RewriteCond %{HTTP:CF-Visitor} '"scheme":"https"' [OR]
RewriteCond %{HTTPS} =on
RewriteRule ^(.*)$ - [env=proto:https]