У меня есть одно приложение с сервером на нескольких доменах (каждый настраивает внешний вид приложения.
Кроме того, существует общий домен с несколькими поддоменами для отображения тех же данных, что и выше.
Так - www.apples.com
выглядит так же, как apples.efruit.co.uk
и - www.bananas.co.uk
выглядит так же, как bananas.efruit.co.uk
и т.д
Теперь у меня есть ssl с подстановочными знаками для домена efruit.co.uk, поэтому я хочу использовать файл htaccess, чтобы заставить все запросы efruit.co.uk использовать https (если это еще не сделано).
Все остальные домены не будут иметь ssl, поэтому им нужно будет использовать http, чтобы избежать предупреждений браузера - опять же из файла htaccess.
Я также хотел бы использовать файл htaccess, чтобы, если кто-то набирает www.apples.efruit.co.uk, он переписывается как apples.efruit.co.uk (поверх https, как указано выше). Однако www. нормально, если это не домен efruit.co.uk.
Наконец, у меня есть стандартное и хорошо документированное правило перезаписи для codeigniter, чтобы сделать URL-адрес красивее.
Вот что у меня есть на данный момент.
Options +FollowSymlinks
RewriteEngine On
RewriteCond %{REQUEST_URI} !(health_check\.php)$
RewriteCond %{HTTP_HOST} ^(.*)\.efruit\.co\.uk
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
RewriteCond %{HTTP_HOST} !^(.*)\.efruit\.co\.uk
RewriteCond %{HTTP:X-Forwarded-Proto} =https
RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI} [R,L]
RewriteCond %{HTTP_HOST} ^www\.([^\.]*)\.efruit\.co\.uk$
RewriteRule (.*) https://%1.efruit.co.uk$1 [R,L]
# block hidden directories
RewriteRule "(^|/)\." - [F]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ ./index.php/$1 [L,QSA]
Единственное, что кажется работающим, - это принудительное обслуживание доменов efruit.co.uk через https.
Похоже, вы используете SSL-прокси (?), Поэтому вы используете X-Forwarded-Proto
заголовок запроса вместо HTTPS
серверная переменная.
RewriteCond %{REQUEST_URI} !(health_check\.php)$ RewriteCond %{HTTP_HOST} ^(.*)\.efruit\.co\.uk RewriteCond %{HTTP:X-Forwarded-Proto} =http RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
Пока вы утверждаете, что этот бит "работает" ("заставляет efruit.co.uk
домены, которые будут обслуживаться через https "), это не будет перенаправлять основной пустой домен, а также будет поддерживать субдомен www, если он присутствует в запросе - вы должны сначала удалить его, чтобы избежать вторичного перенаправления. Итак, изменение в порядок этих директив обязателен.
Вам также не нужна группа захвата (то есть заключенный в скобки подшаблон), если вы не собираетесь использовать ее в качестве обратной ссылки, чего вы, похоже, не являетесь.
Все остальные домены не будут иметь ssl, поэтому им нужно будет использовать http, чтобы избежать предупреждений браузера - опять же из файла htaccess.
Вы не можете выполнить перенаправление HTTPS на HTTP из .htaccess
чтобы избежать предупреждения браузера об этих других доменах - похоже, что вы предлагаете. Поскольку недействительный сертификат SSL предупреждение браузера происходит перед .htaccess
выполняется. Рукопожатие SSL происходит в самом начале запроса.
RewriteCond %{HTTP_HOST} !^(.*)\.efruit\.co\.uk RewriteCond %{HTTP:X-Forwarded-Proto} =https RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI} [R,L]
Таким образом, вышеупомянутое на самом деле не будет выполняться из браузера, если пользователь не примет предупреждение о сертификате SSL (что им не следует).
RewriteCond %{HTTP_HOST} ^www\.([^\.]*)\.efruit\.co\.uk$ RewriteRule (.*) https://%1.efruit.co.uk$1 [R,L]
В .htaccess
это приведет к недопустимому перенаправлению для чего угодно, кроме корня документа, потому что $1
обратная ссылка не имеет префикса косой черты. Даже для корня документа вам действительно следует включить косую черту в конце замена (хотя браузер неявно исправит это). Также любопытно, почему вы использовали REQUEST_URI
серверная переменная в первых двух правилах, но использовали ли здесь обратную ссылку?
Вместо этого попробуйте что-нибудь вроде следующего:
# Prevent any fruther processing when requesting "health_check.php"
# CHECK: Absence of start of string anchor?
RewriteRule health_check\.php$ - [L]
# Remove www sub-subdomain (and redirect to HTTPS)
RewriteCond %{HTTP_HOST} ^www\.([^.]+)\.efruit\.co\.uk [NC]
RewriteRule .* https://%1.efruit.co.uk%{REQUEST_URI} [R,L]
# HTTP to HTTPS redirect for the "efruit.co.uk" domain (and subdomains)
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteCond %{HTTP_HOST} ^([^.]+\.)?efruit\.co\.uk [NC]
RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
# HTTPS to HTTP redirect for none "efruit.co.uk" domains
# Note that the user will still have to click through any browser security warnings
RewriteCond %{HTTP_HOST} !(^|\.)efruit\.co\.uk
RewriteCond %{HTTP:X-Forwarded-Proto} =https
RewriteRule .* http://%{HTTP_HOST}%{REQUEST_URI} [R,L]
Прочие примечания:
$
Якорь конца строки на узле проверяет, чтобы найти полное доменное имя, которое включает конечную точку.R
к R=301
.