2009-09-25 5 views
33

У меня есть несколько доменов, работающих под одним файлом .htaccess, каждый из которых защищен через SSL. Мне нужно заставить https на каждый домен, а также перенаправлять WWW на не-www. Вот что я использую, который не работает:.htaccess перенаправить www на не-www с SSL/HTTPS

RewriteCond %{HTTP_HOST} ^www.%{HTTP_HOST} 
RewriteRule ^.*$ https://%{HTTP_HOST}%{REQUEST_URI}/$1 [R=301,L] 

Пример:

https://www.strategice.com 

должен перенаправлять ...

https://strategice.com 

Спасибо заранее!

+2

Отметить правильный ответ уже! –

ответ

16

Ваше состояние никогда не будет истинным, потому что его как «if (a == a + b)».

Я бы попробовал следующее:

RewriteCond %{HTTP_HOST} ^www\.(.*) 
RewriteRule ^.*$ https://%1/$1 [R=301,L] 

Это будет захватывать "google.com" из "www.google.com" в% 1, остальное в $ 1, а после этого, сочетающей в 2, когда HTTP_HOST начинается с www (с или без https).

+0

К сожалению, это все еще создает ошибку «Connection is Untrusted», когда кто-то пытается получить доступ к https://www.domain.com – aegenes

+0

Хм, но он перенаправляется правильно? Если это может быть проблема с сертификатом. – Fabian

+2

См. [This] (http://stackoverflow.com/a/10726167/372643) для получения сертификата. – Bruno

2

Это работает для меня:

RewriteEngine On 
RewriteCond %{HTTPS} on 
RewriteCond %{HTTP_HOST} ^www\.(.*) 
RewriteRule ^(.*)$ https://%1/$1 [R=301,L] 
5

сертификат должен охватывать как WWW и без WWW по протоколу HTTPS. Некоторые сертификаты поставщика охватывают как для www.xxxx.yyy, так и только для xxxx.yyy.

Включите переписывает:

RewriteEngine On 

сделать все использование HTTP https:

RewriteCond %{SERVER_PORT} 80 
RewriteRule ^(.*)$ https://xxx.yyy/$1 [L,R=301] 

только сделать WWW HTTPS использовать не-WWW https:

RewriteCond %{SERVER_PORT} 443 
RewriteCond %{HTTP_HOST} ^www[.].+$ 
RewriteRule ^(.*)$ https://xxxx.yyy/$1 [L,R=301] 

Не может быть обработка не -www https, в противном случае возникает цикл.

В [L, R = 301]:

  1. L = Если правило было обработано, не обрабатывает больше.
  2. R = 301 = Сообщает обозревателю/роботу о постоянной переадресации.

Более общий

Более общий подход - не порть-зависимый - это:

RewriteCond %{HTTP_HOST} ^www\. 
RewriteRule ^(.*)$ https://xxxx.yyy/$1 [R=301,QSA] 

сделать любой URL с www уронить его.

RewriteCond %{HTTPS} !on 
RewriteCond %{HTTPS} !1 
RewriteCond %{HTTP:X-Forwarded-Proto} !https 
RewriteCond %{HTTP:X-Forwarded-SSL} !on 
RewriteRule ^(.*)$ https://xxxx.yyy/$1 [R=301,QSA] 

, чтобы заставить любой не-HTTPS URL, даже для тех, кто системы вниз по течению от багажных балансиров, что падение по протоколу HTTPS, использует протокол HTTPS.

Обратите внимание, что я не тестировал опции forwarded, так что по достоинству оцените отзывы о любых проблемах с ними.Эти линии могут быть опущены, если ваша система не находится за балансировщиком нагрузки.

К HTTP_HOST или не

Вы можете использовать ${HTTP_HOST} быть частью URL в RewriteRule, или вы можете использовать явное канонический текст доменных имен (xxxx.yyy выше).

Задание имени домена явно гарантирует, что в предоставленном пользователем URL-адресе не используются никакие незначительные средства изгибания символов, чтобы, возможно, обмануть ваш сайт, чтобы сделать что-то, на чем он не может быть подготовлен, или, по крайней мере, гарантирует, что правильное имя домена появляется в адресной строке, независимо от того, какая строка URL открыла страницу.

Это может даже помочь преобразовать домены с кодированием в режиме punycode, чтобы показать правильные символы Юникода в адресной строке.

+0

Работает как очарование! –

+0

Работает невероятно! Спасибо за объяснение. –

44

WWW к не WWW с HTTPS

RewriteEngine on 

RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC] 
RewriteRule ^(.*)$ https://%1/$1 [R=301,L] 

RewriteCond %{HTTPS} !on 
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L] 
+1

«RewriteRule^(. *) $ Http: //% 1/$ 1 [R = 301, L]" изменен на "RewriteRule^(. *) $ Https: //% 1/$ 1 [R = 301, L ] »(by @KenVerhaegen), иначе« сначала будет перенаправлен на не-http, а затем на https ... так что теперь мы можем избежать возможного второго повторного перенаправления ». – alexbt

+0

На самом деле, простое и совпадение, это также должен быть правильный ответ для [* этого вопроса *] (https://stackoverflow.com/questions/21467329/htaccess-force-https-and-redirect-www-to-non-www- но не-другие-поддомены) – Chetabahana

1
RewriteEngine On 

RewriteCond %{HTTP_HOST} ^www\.(.*) 
RewriteRule ^.*$ https://%1/$1 [R=301,L] 

RewriteCond %{HTTPS} off 
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L] 

Это работает для меня после долгих проб и ошибок. Часть первая от пользователя выше и будет захватывать www.xxx.yyy и отправить https://xxx.yyy

Часть 2 рассматривающему введенного URL и проверяет HTTPS, если нет, то он посылает HTTPS

Совершено в этом порядке, он следует за логикой и ошибки не возникает.

ЗДЕСЬ моя полная версия в стороне HTAccess с WordPress:

RewriteEngine On 
RewriteCond %{HTTP_HOST} ^www\.(.*) 
RewriteRule ^.*$ https://%1/$1 [R=301,L] 

RewriteCond %{HTTPS} off 
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L] 


# BEGIN WordPress 
<IfModule mod_rewrite.c> 
RewriteEngine On 
RewriteBase/
RewriteRule ^index\.php$ - [L] 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule . /index.php [L] 
</IfModule> 

# END WordPress 
2

Для применения не-WWW и HTTPS в одном запросе, вы можете использовать следующее правило в вашем Htaccess:

RewriteEngine on 

RewriteCond %{HTTP_HOST} ^www\. [OR] 
RewriteCond %{HTTPS} off 
RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+)$ 
RewriteRule^https://%1%{REQUEST_URI} [NE,L,R] 

Это перенаправляет http://www.example.com/ или https://www.example.com/ - ssl non-www https://example.com/.

Я использую R Флаг перенаправления Temp для целей тестирования и для предотвращения кеширования браузера. Если вы хотите сделать переадресацию постоянной, просто измените флаг R на номер R = 301.

+0

Хм, но все же, когда я вхожу на сайт с сафари на www, говорит, что страница небезопасна, и опера не хочет перенаправлять какой-либо вариант с или без www на ssl, почему? –

1

Ref: Apache redirect www to non-www and HTTP to HTTPS

http://example.com

http://www.example.com

https://www.example.com

в

https://example.com

RewriteEngine On 
RewriteCond %{HTTPS} off [OR] 
RewriteCond %{HTTP_HOST} ^www\. [NC] 
RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+)$ [NC] 
RewriteRule^https://%1%{REQUEST_URI} [L,NE,R=301] 

Если вместо example.com вы хотите URL по умолчанию будет www.example.com, то просто изменить третьи и пятые строки:

RewriteEngine On 
RewriteCond %{HTTPS} off [OR] 
RewriteCond %{HTTP_HOST} !^www\. [NC] 
RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+)$ [NC] 
RewriteRule^https://www.%1%{REQUEST_URI} [L,NE,R=301] 
Смежные вопросы