Это приводит к петле перенаправления, потому что ваша пара 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
s, поэтому переписанное правило перезаписывается обратно в домен 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
директивы, чтобы справиться с этой ситуацией.Хотя это немного излишне, если вы не беспокоитесь об этом.К сожалению, нет хорошего способа узнать, что была проведена внутренняя перезапись, иначе это было бы намного легче объяснить.