Мой сайт включен 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-us
https://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
дополнительные перезаписи.