Общий htaccess перенаправляет www на не-www

Я хочу перенаправить www.example.com на example.com. Следующий код htaccess делает это:

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

Но есть ли способ сделать это обычным образом без жесткого кодирования доменного имени?


person deepwell    schedule 24.10.2008    source источник
comment
Важно знать, что если вы не используете www (или какой-либо другой поддомен), то все файлы cookie будут отправлены на каждый поддомен, и вы не сможете иметь поддомен без файлов cookie для обслуживания статического контента, что уменьшит объем данных, передаваемых между браузером и сервером. То, о чем вы позже можете пожалеть: twitter.com/codinghorror/statuses/1637428313   -  person Sam Hasler    schedule 29.04.2009
comment
Еще одна вещь, которую следует учитывать, - убедитесь, что вы устанавливаете каноническое имя без www на своих страницах, чтобы избежать возможного штрафа за дублирование контента. Также, если у вас есть абсолютные URL-адреса в ваших ссылках, убедитесь, что все они также не являются www.   -  person Jeremy Morgan    schedule 06.12.2012
comment
На мой взгляд, лучше сохранить явное перенаправление, особенно при копировании конфигурации для другого домена, что может потребовать другой настройки (в некоторых случаях лучше использовать домен www) weboptimizer.ch/2014/01/redirection-www   -  person snowflake    schedule 11.03.2014
comment
Любая причина, по которой это решение будет работать во всех случаях, кроме корневого URL-адреса? Например, domain.com не относится к domain.com, тогда как domain.com/page1 перенаправляет на domain.com/page1.   -  person Jeff Solomon    schedule 27.08.2014
comment
Если вы хотите перенаправить www на не-www при сохранении протокола (HTTP или HTTPS), см. Соответствующий вопрос: Перенаправление с www на не-www с сохранением протокола HTTP или HTTPS   -  person MrWhite    schedule 23.01.2019


Ответы (24)


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

То же, что Michael's, за исключением того, что работает: P

person Community    schedule 13.08.2009
comment
Если это не сработает, возможно, вам не хватает RewriteEngine On предшественника, который заставляет его работать. - person hendry; 25.05.2010
comment
@Ben, как мне использовать это в обратном порядке, чтобы добавить www на сайт без www? - person anarkhos; 18.03.2011
comment
Он перенаправляет http://www.domain.com/ на http://domain.com//. Вы должны добавить / к RewruteRule. У меня работает RewriteRule ^/(.*)$ http://%1/$1 [R=301,L]. - person Vladimir Prudnikov; 28.05.2011
comment
Дополнительная косая черта, добавленная Владимиром, помешала мне сработать, и я не увидел двойной косой черты в версии Бена. - person Andrew Swift; 30.11.2011
comment
У меня была та же проблема, что и у Владимира, потому что он перенаправлял на http://domain.com// с двойной косой чертой. Итак, я сделал RewriteRule ^(.*)$ http://%1$1 [R=301,L], и, похоже, пока он работает - person bobfet1; 22.03.2012
comment
@anarkhos Немного поздно .. но это наоборот (добавить WWW к доменам). RewriteCond% {HTTP_HOST}! ^ Www \. [NC] RewriteRule ^ (. *) $ www \.% {HTTP_HOST} / $ 1 [R = 301, L] - person Wireblue; 01.08.2012
comment
Чтобы он работал также на локальном хосте и других компьютерах / устройствах, подключенных к локальной сети, я добавил эти правила: [ПЕРВОЕ ПРАВИЛО] RewriteCond% {HTTP_HOST} \. [ВТОРОЕ ПРАВИЛО] RewriteCond% {HTTP_HOST}! ^ 192. + $ [NC] - person Marco Panichi; 05.04.2013
comment
Используйте следующее решение вместо того, чтобы переписывать движок, он намного быстрее и элегантен: stackoverflow.com/questions/1100343/ - person Birla; 20.07.2014
comment
Ответ Бена работает для меня как есть, я не наблюдаю проблемы с @Vladimir. Кто-нибудь может уточнить? - person matteo; 05.11.2014
comment
Конечно, разумно сделать так, чтобы HTTP_HOST шаблон соответствовал ^www\.(.+)$, чтобы вам требовалось доменное имя? - person Bobulous; 01.05.2015
comment
При этом подпапка www.example.com/sub/index.php становится example.com/index.php. - person Dss; 02.06.2016
comment
В 2018 году это должно быть https: // в последней строке. Я попал в хитрое предупреждение о смешанном содержании, используя этот код как есть вместе с отдельным перенаправлением HTTPS. - person William Entriken; 13.03.2018
comment
Проблема с двойной косой чертой @matteo @ Владимира вызвана попыткой использовать эти директивы в контексте server (или virtualhost). Вышеуказанные директивы написаны для .htaccess (контекст каталога). Если вы находитесь в контексте сервера, вам, вероятно, не следует использовать mod_rewrite для этой задачи, вместо этого используйте директивы mod_alias Redirect в соответствующем vhost, как @Birla ссылается на выше. - person MrWhite; 21.01.2019

Но если нам нужно сделать это для отдельных http и https:

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

RewriteCond %{HTTPS} on
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ https://%1/$1 [R=301,L]
person Andron    schedule 19.03.2010
comment
www.example.com/ перенаправляет на example.com // Как убрать лишнюю косую черту? - person Bobby S; 07.06.2013
comment
Хороший вопрос. Я предполагаю, что быстрым решением будет использование дополнительных правил (т.е. только для этого случая) перед описанными выше. Например: RewriteCond %{HTTPS} off RewriteCond %{HTTP_HOST} ^www.example.com/$ [NC] RewriteRule ^(.*)$ http://www.example.com [R=301,L] ... - person Andron; 13.06.2013
comment
Вы получили бы только лишнюю косую черту (в начале URL-пути), если бы вы разместили эти директивы непосредственно в конфигурации сервера (или виртуального хоста). В .htaccess вы не должны получать лишнюю косую черту. (Следует отметить, что если вы выполняете это перенаправление в конфигурации сервера, вам, вероятно, не следует использовать mod_rewrite для начала ... простой mod_alias Redirect в соответствующем контейнере vhost будет более эффективным и менее подверженным ошибкам.) - person MrWhite; 21.01.2019

Перенаправить без www на www (оба: http + https)

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

RewriteCond %{HTTPS} on
RewriteCond %{HTTP_HOST} !^www\.(.*)$ [NC]
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}/$1 [R=301,L]
person Dmitriy    schedule 10.03.2011
comment
@nightcoder Это потому, что мое решение для обратного перенаправления (с не www на www) в отличие от Андрона - person Dmitriy; 24.11.2013
comment
Примечание: это решение может вызвать некоторые проблемы, если вы собираетесь использовать имена поддоменов для других целей. Например, app.yourdomain.com будет перенаправлен на www.app.yourdomain.com. - person Marty ZHANG; 25.09.2014
comment
Это полная противоположность ответа на вопрос. - person John; 08.11.2017
comment
Мне пришлось добавить RewriteEngine On и RewriteBase /, но в остальном все работало хорошо. - person overthink; 21.05.2018

Если вы хотите сделать это в файле httpd.conf, вы можете сделать это без mod_rewrite (и, видимо, это лучше для производительности).

<VirtualHost *>
  ServerName www.example.com
  Redirect 301 / http://example.com/
</VirtualHost>

Я получил этот ответ здесь: https://serverfault.com/questions/120488/redirect-url-within-apache-virtualhost/120507#120507

person William Denniss    schedule 10.03.2011

Вот правила перенаправления URL с www на no-www:

#########################
# redirect www to no-www
#########################

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

Вот правила перенаправления URL без www на www:

#########################
# redirect no-www to www
#########################

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

Обратите внимание, что я использовал флаг NE, чтобы apache не экранировал строку запроса. Без этого флага apache изменит запрошенный URL http://www.example.com/?foo%20bar на http://www.example.com/?foo%2250bar

person Salman A    schedule 28.04.2012
comment
Можете ли вы написать код для перенаправления http на https вместе с перенаправлением www на не-www - person HYDER ALI; 14.04.2018
comment
Измените http: // на https: //, чтобы принудительно использовать HTTPS при изменении. Вы также захотите добавить обычное перенаправление http- ›https для трафика, который не перенаправляется этими правилами. - person diamondsea; 14.05.2019

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

RewriteCond захватывает все в переменной HTTP_HOST после www. и сохраняет это в %1.

RewriteRule захватывает URL без начального / и сохраняет его в $1.

person Michael Cramer    schedule 24.10.2008
comment
sans leading "/" - В .htaccess (как указано в вопросе) нет ведущего /, поэтому шаблон никогда не совпадает, и перенаправление никогда не происходит. (В контексте server или virtualhost есть только ведущая косая черта.) Кроме того, если у вас есть какие-либо директивы mod_rewrite после этого, вам понадобится флаг L. - person MrWhite; 21.01.2019

Полный универсальный обработчик WWW, http / https

Я не видел полного ответа. Я использую это для обработки включения WWW.

  1. Универсальный. Не требует информации о домене.
  2. Заставляет WWW на основном домене: www.domain.com
  3. Удаляет WWW на поддоменах: sub.domain.com
  4. Сохраняет статус HTTP / HTTPS.
  5. Разрешает отдельные файлы cookie для домена / поддоменов

Пожалуйста, дайте мне знать, как это работает, и если я оставил лазейку.

RewriteEngine On
RewriteBase /

# Force WWW. when no subdomain in host
RewriteCond %{HTTP_HOST} ^[^.]+\.[^.]+$ [NC]
RewriteCond %{HTTPS}s ^on(s)|off [NC]
RewriteRule ^ http%1://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

# Remove WWW. when subdomain(s) in host     
RewriteCond %{HTTP_HOST} ^www\. [NC]
RewriteCond %{HTTPS}s ^on(s)|off [NC]
RewriteCond http%1://%{HTTP_HOST} ^(https?://)(www\.)(.+\.)(.+\.)(.+)$ [NC]
RewriteRule ^ %1%3%4%5%{REQUEST_URI} [R=301,L]
person Gregor Macgregor    schedule 09.02.2016
comment
В исходном вопросе предлагается перенаправить www на не www. Вы заставляете включить www. - person Vadim; 10.03.2018
comment
Это было единственное решение, которое сработало для меня, включая папки и подпапки. Я использую .htaccess - person leonardofmed; 28.10.2020

Попробуй это:

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

Если хост начинается с www, мы вставляем весь хост в начало URL, а затем удаляем www.

person Greg    schedule 24.10.2008
comment
RoBorg, к сожалению, ваши настройки не работают, если я попробую следующее: example.com/hello/world Я оказался здесь: example.com/hello/world/world Мне также пришлось добавьте косую черту после% {HTTP_POST} в первом правиле RewriteRule - person deepwell; 28.10.2008
comment
Я использую Apache / 2.2.9 (Unix). Он работает для www.website, который перенаправляет на веб-сайт. Но для следующего: website / test - ›переходит на: websitetest Я исправил это, добавив еще одну / вторую ошибку: website / test / n переходит на websitetest / n / n - person deepwell; 13.11.2008
comment
Та же проблема, что и у @deepwell с этим. - person neemzy; 21.10.2014
comment
Проблемы, с которыми сталкиваются более ранние читатели, заключаются в том, что эти директивы предназначены для конфигурации сервера (или vhost), а не .htaccess. В контексте каталога (.htaccess) вы должны изменить первый RewriteRule на: RewriteRule ^(.*)$ %{HTTP_HOST}/$1 [C,DPI] (требуется Apache 2.2.12+). Обратите внимание на добавление косой черты и флага DPI (Discard Path Info) - чтобы предотвратить кажущееся дублирование части URL-пути (что на самом деле является информацией о пути), как указано в предыдущих комментариях. Однако есть более простые директивы - как описано в других ответах. - person MrWhite; 21.01.2019

Я считаю, что о перенаправлениях htaccess может быть много дезинформации. Прежде всего, убедитесь, что ваш сайт работает в Unix с использованием Apache, а не на хосте Windows, если вы ожидаете, что этот код будет работать.

RewriteEngine On

RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]

RewriteRule ^(.*)$ http://%1/$1 [R=301,L] 

(Однако убедитесь, что между каждой строкой текста нет пробелов; я добавил дополнительный пробел между строками, чтобы в этом окне отображалось нормально.)

Это один из фрагментов кода, который можно использовать для направления www-версии вашего сайта на http: //-версию. Можно использовать и другие подобные коды.

person Htaccess Redirect    schedule 17.01.2011

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

Для подпапки

person pelajar    schedule 19.10.2011

Для тех, кому нужен доступ ко всему сайту БЕЗ префикса www.

RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
RewriteRule ^ http%{ENV:protossl}://%1%{REQUEST_URI} [L,R=301]

Обязательно добавьте это в следующий файл

/site/location/.htaccess 
person Rick    schedule 04.09.2014
comment
Этот пример не является полным - вы не устанавливаете переменную среды protossl (это не стандартная переменная / серверная переменная). Он всегда будет пустым, поэтому всегда будет перенаправлять на http. (Идея установки protossl ранее в коде предназначена для случаев, когда вы хотите сохранить протокол при перенаправлении. Однако в наши дни вам, вероятно, следует перенаправлять на https все время.) - person MrWhite; 21.01.2019

Я использовал указанное выше правило, чтобы переместить www без www, и оно отлично работает для домашней страницы, однако на внутренних страницах они перенаправляются на /index.php

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

############################################
## always send 404 on missing files in these folders

    RewriteCond %{REQUEST_URI} !^/(media|skin|js)/

############################################
## never rewrite for existing files, directories and links

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-l

############################################
## rewrite everything else to index.php

    RewriteRule .* index.php [L]
person Luke    schedule 22.05.2012
comment
Вам необходимо разместить правила перенаправления без www перед теми, которые вы процитировали. - person Vladimir Jovanović; 24.11.2017

с www на без www с https

RewriteEngine on

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

RewriteCond %{HTTPS} !on
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
person Rajith Ramachandran    schedule 03.03.2015

RewriteEngine on
# if host value starts with "www."
RewriteCond %{HTTP_HOST} ^www\.
# redirect the request to "non-www"
RewriteRule ^ http://example.com%{REQUEST_URI} [NE,L,R]

Если вы хотите удалить www как для http, так и для https, используйте следующее:

RewriteEngine on
RewriteCond %{HTTP_HOST} ^www\.
RewriteCond %{HTTPS}s ^on(s)|offs
RewriteRule ^ http%1://example.com%{REQUEST_URI} [NE,L,R]

Это перенаправляет Non ssl

to

И SSL

to

на apache 2.4.* это можно сделать с помощью директивы Redirect с if,

<if "%{HTTP_HOST} =='www.example.com'">
Redirect / http://example.com/
</if>
person Amit Verma    schedule 10.07.2016

использование: Javascript / jQuery

// similar behavior as an HTTP redirect
window.location.replace("http://www.stackoverflow.com");
// similar behavior as clicking on a link
window.location.href = "http://stackoverflow.com";

Или .htaccess:

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

и метод PHP:

$protocol = (@$_SERVER["HTTPS"]    == "on") ? "https://" : "http://";

if (substr($_SERVER['HTTP_HOST'], 0, 4) !== 'www.') {
    header('Location: '.$protocol.'www.'.$_SERVER    ['HTTP_HOST'].'/'.$_SERVER['REQUEST_URI']);
    exit;
}

Аякс

$.ajax({
    type: "POST",
    url: reqUrl,
    data: reqBody,
    dataType: "json",
    success: function(data, textStatus) {
        if (data.redirect) {
            // data.redirect contains the string URL to redirect to
            window.location.href = data.redirect;
        }
        else {
            // data.form contains the HTML for the replacement form
            $("#myform").replaceWith(data.form);
        }
    }
});
person Universal Omega    schedule 02.08.2017

Использование .htaccess для перенаправления на www или без www:

Просто поместите следующие строки кода в ваш главный корневой файл .htaccess. В обоих случаях просто замените domain.com на свое собственное имя хоста.

Перенаправить на www

<IfModule mod_rewrite.c>
  RewriteEngine on
  RewriteCond %{HTTP_HOST} ^domain\.com [NC]
  RewriteRule ^(.*)$ http://wwwDOTdomainDOtcom/$1 [L,R=301]
</IfModule>

Перенаправить на не-www

<IfModule mod_rewrite.c>
  RewriteEngine on
  RewriteCond %{HTTP_HOST} ^www\.domain\.com [NC]
  RewriteRule ^(.*)$ http://domainDOTcom/$1 [L,R=301]
</IfModule>

измените DOT на =>. !!!

person Rohallah Hatami    schedule 18.04.2019
comment
измените DOT на = ›. !!! - почему бы просто не написать . ?! - person MrWhite; 09.03.2021

Единственный способ заставить его работать ...

RewriteEngine On
RewriteCond %{HTTP_HOST} ^site\.ro
RewriteRule (.*) http://www.site.ro/$1 [R=301,L]
person sulfy    schedule 28.02.2011

Если вы используете www. в URL-адресе или принудительно ssl prototcol, затем попробуйте использовать возможные варианты в файле htaccess, например:

RewriteEngine On
RewriteBase /

### Force WWW ###

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

## Force SSL ###

RewriteCond %{SERVER_PORT} 80 
RewriteRule ^(.*)$ https://example.com/$1 [R,L]

## Block  IP's ###
Order Deny,Allow
Deny from 256.251.0.139
Deny from 199.127.0.259
person mystique    schedule 24.04.2014
comment
Apache может прослушивать другой порт, например 81. Поэтому вместо RewriteCond %{SERVER_PORT} 80 предлагаю использовать такую ​​более универсальную проверку: RewriteCond %{HTTPS} off - person Andron; 08.12.2015

Это обновлено для работы с Apache 2.4:

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

Единственное изменение по сравнению с Майклом - это удаление [NC], которое вызывает ошибку «AH00665»:

Параметр NoCase для шаблона без регулярного выражения '-f' не поддерживается и будет проигнорирован

person William Entriken    schedule 05.05.2016
comment
Предыдущий ответ не требовал обновления для работы с Apache 2.4. Цитируемое вами предупреждение (AH00665) относится к другой директиве (например, если у вас было что-то вроде RewriteCond %{REQUEST_FILENAME} !-f [NC]). Флаг NC не имеет большого значения в приведенном выше, однако причина, по которой флаг NC должен использоваться здесь, состоит в том, чтобы поймать небольшую часть трафика бота, который (неправильно) отправляет имя хоста в верхнем регистре. - person MrWhite; 21.01.2019

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

RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ http://%1%{REQUEST_URI} [L,R=301]
person luky    schedule 15.01.2017

Альтернативный подход, если настройка .htaccess не идеальный вариант:

Я создал простой сервер перенаправления для публичного использования. Просто добавьте запись A или CNAME:

CNAME   r.simpleredirect.net
A       89.221.218.22

Дополнительная информация: https://simpleredirect.net

person Bobík    schedule 18.10.2019

Я не уверен, почему вы хотите удалить www. Но обратная версия будет:

# non-www.* -> www.*, if subdomain exist, wont work
RewriteCond %{HTTP_HOST} ^whattimein\.com
RewriteRule ^(.*)$ http://www.whattimein.com/$1 [R=permanent,L]

И преимущество этого скрипта: если у вас есть что-то вроде test.whattimein.com или любое другое (среда для разработки / тестирования), он не перенаправит U в исходную среду.

person local    schedule 16.12.2011
comment
Следует ли включать субдомен www или нет - это вопрос личных предпочтений и может зависеть от имени домена и целевой аудитории. Общий код, опубликованный выше для перенаправления www на none-www, также обрабатывает тестовые среды в порядке, поскольку перенаправление происходит только тогда, когда www. поддомен встречается. - person MrWhite; 22.01.2012
comment
Этот вопрос противоположен тому, что задает пользователь, а именно загрязняет пост. - person Vadim; 10.03.2018

Добавлено, если localhost, игнорировать перенаправление (для целей разработки в локальной среде). Если не localhost И (не https ИЛИ www), перенаправляйте на https, а не на www.

RewriteEngine On

RewriteBase /
RewriteCond %{HTTP_HOST} !localhost [NC]
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} ^www\. [NC]
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]
person Jeaf Gilbert    schedule 13.12.2019
comment
Пожалуйста, доработайте свой код, чтобы ОП понимал, как это отвечает на вопрос. - person RyanNerd; 13.12.2019

Привет, вы можете использовать следующие правила для своего файла htaccess:

RewriteEngine On
RewriteCond %{HTTP_HOST} ^example.com
RewriteRule (.*) http://www.example.com/$1 [R=301,L]
person Chirag Parekh    schedule 05.05.2015
comment
Вопрос заключается в общем решении, которое не включает доменное имя. Ваше решение также выполняет полную противоположность тому, что запрашивается в вопросе (без www на www, а не с www на не www) без объяснения причин. - person MrWhite; 21.01.2019