В моем файле .htaccess
есть следующее:
<IfModule mod_rewrite.c>
Options +FollowSymlinks
RewriteEngine On
# Block hidden directories
RewriteRule "(^|/)\." - [F]
# Prevent /health_check.php from using https
RewriteCond %{REQUEST_URI} !(health_check\.php)$
# Prevent /sns from using https but this DOES need codeigniter rewriting (see below)
RewriteCond %{REQUEST_URI} !^/(sns)/
# Reroute http to https
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
# Prevent rewriting of domain for codeigniter
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ ./index.php/$1 [L,QSA]
</IfModule>
Кажется, все работает нормально, за исключением части / sns
. Я не могу заставить это прекратить перенаправление на https.
Я бы хотел http://sub.example.com/sns
и http://sub.example.com/health_check .php
, чтобы не перенаправлять на https.
# Запретить / sns использовать https, но для этого НЕОБХОДИМО перезапись codeigniter (см. Ниже) RewriteCond% {REQUEST_URI}! ^ / (Sns) /
Если URL-адрес запроса не заканчивается косой чертой (как указано), то указанное выше правило (которое включает конечную косую черту в CondPattern ) всегда будет успешным (это инвертировано. условие), поэтому перенаправление на HTTPS будет происходить всегда.
В идеале, вы должны канонизировать завершающую косую черту раньше в запросе. Включите либо завершающую косую черту, либо нет (в противном случае это по существу дублированный контент и потенциально может вызвать проблемы с другими скриптами, анализирующими URL-адрес).
Однако для обработки двух URL-адресов / sns
и / sns /
, то вам нужно сделать завершающую косую черту необязательной и включить привязку конца строки ( ^
). Например:
RewriteCond %{REQUEST_URI} !^/sns/?$
Обратите внимание, что это соответствует только двум указанным URL. Он не будет соответствовать URL-адресу формы / sns /
.
Я удалил круглые скобки вокруг сегмента пути (вы также должны удалить другие круглые скобки в вашем регулярном выражении). Это создает захваченную группу и является излишним в опубликованных вами директивах.
ОБНОВЛЕНИЕ: Вам также потребуется дополнительная проверка, чтобы убедиться, что перезаписанный URL (т.е. /index.php/sns
) не перенаправляется. Вы можете сделать это более общим способом, применив перенаправление HTTPS только к начальному запросу, а не к перезаписанному запросу, включив дополнительное условие:
# Only applies to direct requests (not rewritten requests)
RewriteCond {%ENV:REDIRECT_STATUS} ^$
Переменная среды REDIRECT_STATUS
установлена на «200» после первой успешной перезаписи (т. е. маршрутизации CodeIgniter). Он не установлен в первоначальном запросе (например, ^ $
- пустая строка).
Если это все еще приводит к перенаправлению, возможно, что CodeIgniter сам инициирует перенаправление (после . htaccess
был обработан).
RewriteRule ^ (. *) $ ./index.php/$1 [L, QSA]
В сторону: И, как отмечалось в моем комментарии, вам следует удалить префикс ./
в замене RewriteRule
. См. конец моего ответа на этот вопрос StackOverflow для объяснения.
Options +FollowSymlinks
RewriteEngine On
# Block hidden directories
RewriteRule ^\. - [F]
# Only applies to direct requests (not rewritten requests)
RewriteCond {%ENV:REDIRECT_STATUS} ^$
# Prevent /health_check.php from using https
RewriteCond %{REQUEST_URI} !health_check\.php$
# Prevent /sns from using https but this DOES need codeigniter rewriting (see below)
RewriteCond %{REQUEST_URI} !^/sns/?$
# Reroute http to https
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
# Prevent rewriting of domain for codeigniter
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L,QSA]
Перенаправление HTTP на HTTPS в конечном итоге должно быть 301 (постоянным) перенаправлением, но только как только вы подтвердите, что он работает нормально. Флаг R
по умолчанию установлен на 302 (временное) перенаправление.
(Вам также не нужна оболочка
, если ваш сайт не предназначен для работы без mod_rewrite?)