在.htaccess重定向中保留HTTP / HTTPS协议

时间:2013-10-15 03:00:41

标签: .htaccess mod-rewrite rewrite

我必须在htaccess中将端口80重定向到2368,但我希望保持所请求的协议不变,以便SSL不会中断。

我目前有这个:

RewriteCond %{HTTP_HOST} ^sub.domain.com$ [NC]
RewriteRule ^ http://sub.domain.com:2368%{REQUEST_URI} [P,QSA,L]

正常工作,但我希望协议从%{HTTP_HOST}条件中获取。如果可能的话。

如果没有硬编码域和协议,有没有办法让它变得更加动态?

现在看起来很慢。

5 个答案:

答案 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>

如果您想同时使用这两种功能,请将两者都放在代码块上方 适当地。