htaccess файл для выполнения определенных правил для разных доменов

У меня есть одно приложение с сервером на нескольких доменах (каждый настраивает внешний вид приложения.

Кроме того, существует общий домен, который имеет несколько поддоменов для отображения тех же данных, что и выше.

Так - 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, он перезаписывался как apple.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.

1 ответ

Решение

Вы, похоже, находитесь за 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]

Другие заметки:

  • Не нужно использовать обратную косую черту, чтобы избежать буквальной точки при использовании внутри класса символов.
  • Я удалил $ привязка конца строки на проверке хоста, чтобы поймать полное доменное имя, которое включает в себя конечную точку.
  • Возможно, вы захотите изменить эти постоянные (301) перенаправления, как только подтвердите, что они работают нормально. то есть. менять R в R=301,
Другие вопросы по тегам