2015-10-04 4 views
2

В настоящее время я редирект, который работает, чтобы перенаправлять все HTTP-страницы на соответствующих HTTPS страниц для http://www. и http:// страницы следующим образом:Htaccess HTTP на HTTPS-переадресации для WWW и поддомен

# redirect all pages to https://www 
RewriteEngine On 
RewriteCond %{HTTP_HOST} !^www\. [NC] 
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}/$1 [R=301,L] 
# redirect http to https 
RewriteEngine On 
RewriteCond %{HTTPS} off 
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L] 

Я также необходимо включить переадресацию на поддомене http://my., чтобы перейти к https://my.

Если я ставлю переадресацию в файле .htaccess для домена к югу, он вмешивается в .htaccess файл для WWW.

Какие изменений мне нужно сделать для следующей работы:

  • Перенаправления всего http://www. и http:// страницы в соответствующем протоколе HTTPS страницы
  • Перенаправление всего http://my. страницы в соответствующем протоколе HTTPS страницы

без одного испортить другой.

+0

Я думаю, что кто-то проголосовал меня один, потому что я использовал HTTP // в моем вопросе, а не HTTP: //. Я хотел бы сообщить им, что это потому, что, поскольку пользователь без рейтинга 10 или более, я не могу опубликовать более двух ссылок в вопросе. Спасибо за исправление. – ostii

ответ

3

Итак, проблема с mod_rewrite является то, что правила перезаписи:

RewriteCond %{HTTP_HOST} !^www\. [NC]

будет соответствовать ничего, что не начинается с WWW.

Синтаксис этой линии:

RewriteCond {string to match} {regular expression to match} {other parameters}

В вашем случае, он говорит:

Match любой URL которого имя хоста (%{HTTP_HOST}) не (!) начинаются с (^) " WWW. ". (Обратная косая черта перед периодом состоит в том, что период имеет особое значение в регулярных выражениях - это означает «любой символ»).

[NC] в конце означает игнорировать капитализацию.

Таким образом, первая часть вашего .htaccess

# redirect all pages to https://www 
RewriteEngine On 
RewriteCond %{HTTP_HOST} !^www\. [NC] 
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}/$1 [R=301,L] 

говорит: "WWW"

Rewrite каждый URL которого хозяин не начинается с, в том числе, по предваряя " "меня." WWW. ".

Очевидно, что это перепишет me.whatever.com на www.me.whatever.com.

Что вам нужно сделать, чтобы исправить это, добавьте другое правило матча, чтобы исключить этот случай.

т.е. RewriteCond %{HTTP_HOST} !^me\. [NC]

Так полный .htaccess должен быть:

# redirect all pages to https://www 
RewriteEngine On 
RewriteCond %{HTTP_HOST} !^www\. [NC] 
RewriteCond %{HTTP_HOST} !^me\. [NC] 
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}/$1 [R=301,L] 
# redirect http to https 
RewriteEngine On 
RewriteCond %{HTTPS} off 
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L] 

Так что теперь условие перезапись: Если имя хоста не начинается с WWW. И не начинается со мной., THEN preend www.

Вот хороший тестер, который вы можете использовать, чтобы играть с различными решениями: http://htaccess.madewithlove.be/

А чтобы узнать, как писать эти файлы, первым узнать регулярные выражения; они являются неотъемлемой частью инструментария любого технолога!

Удачи :)

+1

Это соединение htaccess выглядит замечательно. Я собираюсь дать ему попробовать в следующий раз, когда у меня возникнут проблемы с htaccess. – Martin

+0

Хороший! и для общего регулярного выражения, https://regex101.com/ - мой любимый – ptim

+1

Отлично. Большая часть этого сработала, но позже я обнаружил другие факторы - что в httpd.conf было еще одно перенаправление, к которому у меня не было доступа, что вызвало цикл перенаправления. – ostii

Смежные вопросы