.htaccess - как заставить www. в общем виде?


102

Это изменится domain.comна www.domain.com:

# Force the "www."
RewriteCond %{HTTP_HOST} !^www\.domain\.com$ [NC]
RewriteRule ^(.*)$ http://www.domain.com/$1 [R=301,L]

Как мне заменить часть «домен», чтобы это работало на любом домене?

Ответы:


249

Я бы использовал это правило:

RewriteEngine On
RewriteCond %{HTTP_HOST} !=""
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteCond %{HTTPS}s ^on(s)|
RewriteRule ^ http%1://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

Первое условие проверяет, не является ли значение Host пустым (в случае HTTP / 1.0); второй проверяет, не начинается ли значение Host с www.; третий проверяет HTTPS ( %{HTTPS}либо onили off, так что %{HTTPS}sлибо onsили , offsи в случае подобран). Подстановочная часть просто объединяет информационные части в полный URL.onssRewriteRule


31
Это решение работает только в том случае, если вы хотите, чтобы все поддомены перенаправлялись на www.yourdomain.com. Если вы хотите принудительно использовать только www, вам следует обновить вторую строку следующим образом:RewriteCond %{HTTP_HOST} ^yourdomain.com [NC]
Джаред Помранки,

2
Я не перенаправляю ни один из моих поддоменов на www.mydomain.com с использованием правила, указанного в вопросе ...
lol

3
очень умный! Мне нравится, что вы заставили проверку HTTPS возвращать "S" в группе захвата, которую вы использовали в следующей строке. очень элегантно
code_monk

Похоже на универсальный ответ, охватывает HTTP и обычные протоколы, работает как шарм.
Clain Dsilva 03

1
Спасибо! Я бы добавил RewriteEngine Onв качестве первой строки, чтобы завершить его, так как это может привести к ошибке сервера 500, если скопировать как есть.
Райан Касас


5

Если вы хотите перенаправить все запросы, не относящиеся к www, на ваш сайт, на версию с www, все, что вам нужно сделать, это добавить следующий код в ваш файл .htaccess:

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

3

Это не будет работать с поддоменами.

domain.com правильно перенаправляется на www.domain.com

но

images.domain.com перенаправляется на www.images.domain.com

Вместо того, чтобы проверять, является ли субдомен «не www», проверьте, есть ли две точки:

RewriteCond %{HTTP_HOST} ^(.*)$ [NC]
RewriteCond %{HTTP_HOST} !^(.*)\.(.*)\. [NC]
RewriteCond %{HTTPS}s ^on(s)|
RewriteRule ^ HTTP%1://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

Мне нравится это решение. В любом случае, чтобы сделать то же самое с доменами верхнего уровня, такими как .co.uk?
TylersSN

1
@iUseMagentoNow, просто увеличьте количество точек, например: RewriteCond %{HTTP_HOST} !^(.*)\.(.*)\.(.*)\. [NC](Строго говоря, ваш домен верхнего уровня остается, .ukа ваш домен остается something.co.)
mirabilos

.co в данном случае является доменом второго уровня и фактически не является частью вашего домена, тогда как .uk - это домен верхнего уровня с кодом страны. Честно говоря, поработав в индустрии хостинга и увидев новые форматы доменных имен, я не вижу, чтобы текущие форматы TLD были пригодны для чего-либо, кроме официального использования. правительства, организации и т. д. В ближайшем будущем, когда вы сможете зарегистрировать fqdn like, fred.bloggs по цене, аналогичной текущим нормам, личный Интернет будет сильно отличаться с точки зрения DNS.
Крис

1

Следующее должно быть префиксом www для любого запроса, у которого его нет, и перенаправить отредактированный запрос на новый URI.

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

1
RewriteEngine On

RewriteCond %{HTTP_HOST} ^[^.]+\.[^.]+$
RewriteRule ^ http://www.%{HTTP_HOST}%{REQUEST_URI} [NE,L,R=301]

Это перенаправляет example.comна www.example.comисключение поддоменов.


Для меня это похоже на отправку www.example.com на www.www.example.com ха-ха
Альберт Реншоу

@Albert Возможно, это из-за кеша вашего браузера. Очистите кеш и повторите попытку.
Амит Верма

Ты прав! Я только что запустил инкогнито (хром), и все заработало, спасибо!
Альберт Реншоу

1
Мне очень нравится это общее правило. Но для domain.co.uk он не работает, так как на нем уже есть две точки. Как можно изменить это правило, чтобы оно работало и для домена .co.uk?
Sacha Vorbeck

1
Для .co.uk и других дополнительных cctld это работает: ^ ([^.] + \. [^.] +) (\. (Uk | ar | cy | ar | tr))? $, Но, к сожалению, есть некоторые смешанные типизированные tld ( wiki.mozilla.org/TLD_List ), например es, которые разрешают domain.es, а также domain.com.es. Добавление | es в регулярное выражение будет соответствовать domain.es, а также www.domain.es, что здесь не требуется. Надо найти способ справиться с этими подчиненными cctld со смешанным типом
Саша Форбек


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.