.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]

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

StackOverflowNewbie
источник

Ответы:

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, если скопировать как есть.
Райан Касас
44

Это сделает это:

RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]
Мартин Драпо
источник
5

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

RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]
ClickForWebs
источник
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]
RoUS
источник
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 со смешанным типом
Саша Форбек
0

Это старый вопрос, и есть много разных способов сделать это. Самый полный ответ, ИМХО, можно найти здесь: https://gist.github.com/vielhuber/f2c6bdd1ed9024023fe4 . (Вставка и форматирование кода здесь у меня не сработали)

Рик Хеллюэлл
источник
-1

это сработало для меня как по волшебству

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

СамЯ
источник