Apache 重定向到http

Apache 重定向到http,apache,.htaccess,mod-rewrite,Apache,.htaccess,Mod Rewrite,我在.htaccess中有一些重写规则,如果是安全区域,可以将域切换到https。 如果它不是一个安全区域,我希望它切换回http,以下是我的规则: RewriteCond %{SERVER_PORT} =443 RewriteCond %{REQUEST_URI} !^/account(.*)$ RewriteCond %{REQUEST_URI} !^/shop/checkout(.*)$ RewriteRule ^(.*)$ http://www.domain.com/$1 [R,L] R

我在.htaccess中有一些重写规则,如果是安全区域,可以将域切换到https。 如果它不是一个安全区域,我希望它切换回http,以下是我的规则:

RewriteCond %{SERVER_PORT} =443
RewriteCond %{REQUEST_URI} !^/account(.*)$
RewriteCond %{REQUEST_URI} !^/shop/checkout(.*)$
RewriteRule ^(.*)$ http://www.domain.com/$1 [R,L]
RewriteCond %{SERVER_PORT} !^443$
RewriteRule ^account(.*)$ https://www.domain.com/account$1 [R,L]
RewriteCond %{SERVER_PORT} !^443$ 
RewriteRule ^shop/checkout(.*)$ https://www.domain.com/shop/checkout$1 [R,L]

# Route all traffic to index.php
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php?_args=$1 [L,QSA]
前3行未注释,因为它会导致重定向循环。
任何帮助都会导致重定向循环,因为您的
RewriteCond
对将始终计算为
true
。首先要检查您是否实际在SSL端口上,然后要确保请求与您的安全路径不匹配

因此,您的三行注释应更改为:

RewriteCond %{SERVER_PORT} =443
RewriteCond %{REQUEST_URI} !^/account(.*)$
RewriteCond %{REQUEST_URI} !^/shop/checkout(.*)$
RewriteRule ^(.*)$ http://www.domain.com/$1
编辑:显然,您确实需要在该重定向上使用显式的
[R,L]
。此外,
mod_rewrite
执行URL
/index.php
的内部重定向,该重定向与
RewriteCond
检查的安全路径不匹配,因此重写的规则将被重新重写回http域。以下内容应能解决这两个问题,尽管不是万无一失:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{SERVER_PORT} =443
RewriteCond %{REQUEST_URI} !^/account(.*)$
RewriteCond %{REQUEST_URI} !^/shop/checkout(.*)$
RewriteRule ^(.*)$ http://www.domain.com/$1 [R,L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{SERVER_PORT} !^443$
RewriteRule ^(shop/checkout|account)(.*)$ https://www.domain.com/$1$2 [R,L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)?$ index.php?_args=$1 [QSA]

理论上,人们仍然可以通过
http://www.domain.com/index.php?_args=account
这种方式,因此,如果这让您感到困扰,可以编写一些更复杂的
RewriteCond
指令来处理这种情况。如果你不担心的话,那就有点过头了。不幸的是,据我所知,没有很好的方法可以知道执行了内部重写,否则这将更容易解释。

这对我来说不起作用,我在移动到https时得到了重定向循环,我还假设你指的是端口443Whoops,已修复。另外,
REQUEST\u URI
以正斜杠开头,正斜杠可能阻止了
RewriteCond
的正确匹配,希望现在能正常工作;我已经在我的原始问题中编辑了我的规则,感谢任何帮助好的,让我们再试一次。这一次我设置了一个测试场景,所以我已经确认它至少在我这方面是有效的。