перенаправить на http - PullRequest
       0

перенаправить на http

0 голосов
/ 25 июня 2010

У меня есть некоторые правила переписывания в моем .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 строки не закомментированы, поскольку это приводит к циклу перенаправления.любая помощь приветствуется

1 Ответ

2 голосов
/ 26 июня 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...