Мой сайт включен HTTPS, и все страницы обслуживаются только с помощью HTTPS .  У клиента теперь есть требование, где он хочет показывать статические страницы, такие как about-us , termsofus как страницы HTTP, а не как HTTPS .  Это означает, что даже если пользователь пытается открыть страницу about-us как HTTPS, он должен перенаправить на HTTP-версию about-us . 
  Мой код .htaccess выглядит следующим образом: 
 Options -Indexes <IfModule mod_rewrite.c> RewriteEngine on #RewriteCond %{HTTPS} off #RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] RewriteCond %{HTTPS} off RewriteCond %{REQUEST_URI} !^\/about-us RewriteCond %{REQUEST_URI} !^\/termsofus RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] RewriteCond %{HTTPS} on RewriteCond %{REQUEST_URI} \/about-us [OR] RewriteCond %{REQUEST_URI} \/termsofus RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . index.php </IfModule> 
  Проблема: всякий раз, когда я открываю HTTP-версию HTTPS about-us страницы, она продолжает перенаправлять меня на index.php .  Например: https://example.com/about-us https://example.com/index.php 
Сайт использует инфраструктуру PHP YII.
  Используйте переменную THE_REQUEST вместо REQUEST_URI .  THE_REQUEST представляет собой исходный запрос, полученный Apache из вашего браузера, и он не перезаписывается после выполнения некоторых правил перезаписи . 
 Options -Indexes RewriteEngine on RewriteCond %{HTTPS} off RewriteCond %{THE_REQUEST} !\s/+(about-us|termsofus) [NC] RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301,NE] RewriteCond %{HTTPS} on RewriteCond %{THE_REQUEST} \s/+(about-us|termsofus) [NC] RewriteRule ^ http://%{HTTP_HOST}%{REQUEST_URI} [L,R=301,NE] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . index.php 
Перед тестированием этого изменения обязательно очистите кеш браузера.
Ответ anubhava уже решает проблему и обеспечивает хорошее решение. Я подумал, что просто объясню, что происходит с вашим заявленным примером со ссылкой на ваш исходный код:
Например:
https://example.com/about-ushttps://example.com/index.php
  Учитывая запрос для https://example.com/about-us : 
  Это соответствует вашему второму правилу (HTTPS – «on», и about-us запрашивается) и перенаправляется на http://example.com/about-us (т. Е. Обратно на HTTP). 
  Перенаправленный запрос (т. http://example.com/about-us ) теперь соответствует последнему правилу и внутренне переписывается в index.php (фронт-контроллер). 
  Однако в файлах .htaccess каждого каталога (контекст каталога ) «перезаписанный запрос передается механизму синтаксического анализа URL-адреса», и процесс начинается эффективно.  Переменная сервера REQUEST_URI также обновляется, чтобы сохранить перезаписанный URL, т.е.  /index.php . 
  Во втором проходе через файл .htaccess запрос (теперь переписанный на http://example.com/index.php ) соответствует вашему первому правилу (HTTPS «выключен», а запрос не является /about-us /termsofus ) поэтому запрос перенаправляется (второй раз) на https://example.com/index.php .  (Внутренний переписывающий файл фактически преобразуется во внешнее перенаправление .) 
  Переадресованный запрос (теперь https://example.com/index.php ) не соответствует никаким правилам в вашем файле .htaccess , поэтому проходит без изменений.  Страница подана. 
Если вы проверите сетевой трафик, вы увидите две внешние перенаправления, упомянутые выше.
  Другое возможное решение – использовать флаг END (только Apache 2.4+) в последнем RewriteRule .  Это эффективно завершает процесс перезаписи URL-адресов, поэтому процесс останавливается на шаге 2.  Хотя я по-прежнему предпочитаю решение THE_REQUEST вместо этого проверяю THE_REQUEST , что работает на Apache 2.2 и все равно будет работать, если вы THE_REQUEST дополнительные перезаписи.