我必须在htaccess中将端口80重定向到2368,但我希望保持所请求的协议不变,以便SSL不会中断。
我目前有这个:
RewriteCond %{HTTP_HOST} ^sub.domain.com$ [NC]
RewriteRule ^ http://sub.domain.com:2368%{REQUEST_URI} [P,QSA,L]
正常工作,但我希望协议从%{HTTP_HOST}条件中获取。如果可能的话。
如果没有硬编码域和协议,有没有办法让它变得更加动态?
现在看起来很慢。
答案 0 :(得分:58)
Jon提供的技巧是一个很好的黑客攻击,但是如果你想使用更多的[OR]
条件,恐怕它可能会破坏,如果你使用更多的反向引用,你必须要小心使用哪个数字({ {1}}或%1
或..)。
我认为smart HTTP/HTTPS handling最优雅,最强大,最干净的解决方案是设置变量:
%2
优点还在于初始化代码只需要运行一次,因此如果你有更多的重写规则,那么结果代码会更短更优雅。
请注意,常见的设置是使用cloudflare提供的https,在这种情况下,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]
答案 1 :(得分:44)
从Apache 2.4开始,您还可以使用变量%{REQUEST_SCHEME}
来保留方案:
RewriteRule "^" "%{REQUEST_SCHEME}://sub.domain.com:2368%{REQUEST_URI}" [P,QSA,L]
无需以这种方式干涉任何条件。
答案 2 :(得分:21)
尝试添加以下条件:
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTPS}:s on:(s)
哪个检查HTTPS已关闭或已启用,您可以使用反向引用来获取“s”字符:
RewriteCond %{HTTP_HOST} ^sub.domain.com$ [NC]
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTPS}:s on:(s)
RewriteRule ^ http%1://sub.domain.com:2368%{REQUEST_URI} [P,QSA,L]
因此,如果HTTPS已关闭,则%1
为空,协议为http://
。如果启用了HTTPS,则“s”被分组,%1
反向引用为“s”,因此协议为https://
。
但是,这都假设端口2368可以处理两个未加密和SSL / TLS。
答案 3 :(得分:7)
或者,您可以使用the solution posted as an answer by Jon Lin并将其重写为使用一个RewriteCond
,然后设置变量as suggested in the answer by TMS。
看起来像这样:
RewriteCond %{HTTPS}s ^(on(s)|offs)$
RewriteRule ^ - [env=s:%2]
RewriteCond %{HTTP_HOST} ^sub.domain.com$ [NC]
RewriteRule ^ http%{ENV:s}://sub.domain.com:2368%{REQUEST_URI} [P,QSA,L]
或者,如果您愿意:
RewriteCond %{HTTPS}s ^(on(s)|offs)$
RewriteRule ^ - [env=proto:http%2]
RewriteCond %{HTTP_HOST} ^sub.domain.com$ [NC]
RewriteRule ^ %{ENV:proto}://sub.domain.com:2368%{REQUEST_URI} [P,QSA,L]
答案 4 :(得分:0)
http到https重定向:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTPS} !on
RewriteRule ^(.*)$ https://%{SERVER_NAME}%{REQUEST_URI} [R=301,L]
</IfModule>
非www到www重定向:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}/$1 [R=301,L]
</IfModule>
如果您想同时使用这两种功能,请将两者都放在代码块上方 适当地。