файл .htaccess для выполнения определенных правил для разных доменов [дубликат]

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

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

Итак - www.apples.com выглядит так же, как apples.efruit.co.uk

и - www.bananas.co.uk выглядит так же, как bananas.efruit.co.uk

и т. Д.

Нет w, у меня есть 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.

1
задан 1 March 2018 в 23:32
1 ответ

Кажется, вы стоите за SSL proxy(?), поэтому вместо переменной сервера HTTPS используется заголовок запроса X-Forwarded-Proto.

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 cert браузера возникает до того, как .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 не имеет префикса косая черта. Даже для корня документа вы должны действительно включить косую черту на substitution (хотя браузер неявно исправит это). Кроме того, любопытно, почему вы использовали 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]

Другие примечания:

  • Нет необходимости обратного слеша избежать буквальной точки при использовании внутри класса символов.
  • Я удалил $ конец строки якоря на хосте проверки, чтобы поймать FQDN, которые включают трейлинг-точку.
  • Вы, вероятно, захотите изменить эти постоянные (301) перенаправления, как только подтвердите, что они работают нормально, т.е. изменить R на R=301.
1
ответ дан 3 December 2019 в 23:19

Теги

Похожие вопросы