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

485

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

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

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

глубокий колодец
источник
64
Важно помнить, что если вы не используете www (или какой-либо другой поддомен), то все куки будут отправляться на каждый поддомен, и вы не сможете иметь поддомен без файлов cookie для обслуживания статического контента, что уменьшит количество данных, передаваемых между браузером и сервером. Что-то, о чем вы могли позже пожалеть: twitter.com/codinghorror/statuses/1637428313
Сэм Хаслер,
3
Еще одна вещь, которую нужно учитывать, убедитесь, что вы устанавливаете каноническое имя без www на своих страницах, чтобы избежать возможного штрафа за дублирование контента. Кроме того, если у вас есть абсолютные URL в ваших ссылках, убедитесь, что они все не-www.
Джереми Морган
На мой взгляд , лучше , чтобы сохранить явное переназначение, особенно при копировании конфигурации для другого домена, который может потребоваться различные настройки (домен WWW лучше в некоторых случаях) weboptimizer.ch/2014/01/redirection-www
Снежинка
Любая причина, почему это решение будет работать для всех случаев, кроме корневого URL? Например, domain.com не выполняет piont для domain.com , тогда как domain.com/page1 перенаправляет на domain.com/page1 .
Джефф Соломон
Если вы хотите перенаправить www на не-www, поддерживая протокол (HTTP или HTTPS), то посмотрите этот связанный вопрос: Перенаправление www на не-www при поддержании протокола HTTP или HTTPS
MrWhite

Ответы:

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

То же, что и у Майкла, но этот работает

Volomike
источник
16
Если это не работает, возможно, вам не хватает RewriteEngine Onпрекурсора, чтобы заставить его работать.
Хендри
8
@ Бен, как бы я использовал это наоборот, чтобы добавить www на сайт без www?
анархос
18
Он перенаправляет http://www.domain.com/на http://domain.com//. Вы должны добавить /в RewruteRule. Это работает для меня RewriteRule ^/(.*)$ http://%1/$1 [R=301,L].
Владимир Прудников
13
У меня была та же проблема, что и у Владимира, когда он перенаправлял http://domain.com//с двойными косыми чертами. Так я и сделал, RewriteRule ^(.*)$ http://%1$1 [R=301,L] и, кажется, работает до сих пор
bobfet1
5
Пожалуйста, используйте следующее решение вместо того, чтобы переписывать движок, он гораздо быстрее и элегантнее: stackoverflow.com/questions/1100343/…
Birla
111

Но если нам нужно сделать это для отдельных 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]
Андрон
источник
2
www.example.com/ перенаправляет на example.com// Любой способ удалить лишнюю косую черту?
Бобби S
Хороший вопрос. Я предполагаю, что быстрое решение будет состоять в том, чтобы использовать дополнительные правила (т.е. только для этого случая), прежде чем они описаны выше. Например: RewriteCond %{HTTPS} off RewriteCond %{HTTP_HOST} ^www.example.com/$ [NC] RewriteRule ^(.*)$ http://www.example.com [R=301,L] ...
Андрон
3
@BobbyS Я использовал решение в этой статье . Он перенаправляет www и HTTP на HTTPS без www, а также обрабатывает трейлинг /.
Тотемедли
Вы получите дополнительную косую черту (в начале URL-пути), если вы разместите эти директивы непосредственно в конфигурации сервера (или виртуального хоста). У .htaccessвас не должно быть лишнего слеша. (Просто отметим, что если вы выполняете это перенаправление в конфигурации сервера, вам, вероятно, не следует использовать mod_rewrite для начала ... простой mod_alias Redirectв соответствующем контейнере vhost будет более эффективным и менее подверженным ошибкам.)
MrWhite
72

Перенаправить не-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]
Дмитрий
источник
4
@nightcoder Это потому, что мое решение для обратного перенаправления (с не-www на www) в отличие от Andron
Дмитрий
2
Примечание: это решение может вызвать некоторые проблемы, если вы собираетесь использовать имена поддоменов для других целей. Например, app.yourdomain.com будет перенаправлен на www.app.yourdomain.com.
Марти ЧЖАНГ
1
Это полная противоположность ответу на вопрос.
Джон
Я должен добавить RewriteEngine Onи RewriteBase /, но в остальном работает хорошо.
задуматься
45

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

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

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

Уильям Денисс
источник
33

Вот правила перенаправления 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

Салман А
источник
1
Вы можете написать код для перенаправления http на https вместе с перенаправлением www на не-www
HYDER ALI
Измените http: // на https: //, чтобы изменить его на HTTPS. Вы также захотите добавить регулярное перенаправление http-> https для трафика, который не перенаправляется по этим правилам.
Diamondsea
11
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^/(.*)$ https://%1/$1 [R]

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

В RewriteRuleЗахватывает URL без ведущего /и сохраняет его в $1.

Майкл Крамер
источник
1
sans leading "/"- В .htaccess(как указано в вопросе) нет ведущего /, поэтому шаблон никогда не совпадает и перенаправление никогда не происходит. (В контексте сервера или виртуального хоста есть только начальная косая черта .) Кроме того, если после этого у вас есть какие-либо директивы mod_rewrite, вам понадобится Lфлаг.
MrWhite
7

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

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

Если хост начинается с www, мы помещаем весь хост в начало URL, затем снимаем «www».

Greg
источник
1
Роборг, к сожалению, твои настройки не работают, если я попробую это: example.com/hello/world, я окажусь здесь: example.com/hello/world/world Мне также пришлось добавить косую черту после% {HTTP_POST} в Первый RewriteRule
Deepwell
2
Я использую Apache / 2.2.9 (Unix). Это работает для www.website, который перенаправляет на веб-сайт, но для следующего: website / test -> идет на: websitetest Я исправил это, добавив еще одну / вторую ошибку: website / test / n перешел
deepwell
1
Та же проблема, что и у @deepwell с этим.
neemzy
Проблемы, с которыми сталкиваются более ранние читатели, заключаются в том, что эти директивы предназначены для конфигурации сервера (или vhost), а не .htaccess. В контексте каталога ( .htaccess) вы должны изменить первое RewriteRuleна следующее: RewriteRule ^(.*)$ %{HTTP_HOST}/$1 [C,DPI](требуется Apache 2.2.12+). Обратите внимание на добавление косой черты и DPIфлага (Discard Path Info) для предотвращения дублирования части URL-пути (который фактически является «path-info»), как указано в предыдущих комментариях. Тем не менее, существуют более простые директивы - как описано в других ответах.
MrWhite
7

Полный общий обработчик WWW, http / https

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

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

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

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]
Грегор Макгрегор
источник
Оригинальный вопрос просит перенаправить wwwна не- www. Вы заставляете включение www.
Вадим
6

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

RewriteEngine On

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

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

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

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

Htaccess Redirect
источник
3
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ http://%1/subfolder/$1 [R=301,L]

Для подпапки

pelajar
источник
3

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

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

Вы уверены, что добавили это в следующий файл

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

Использование .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 на =>. !!!

Рохалла Хатами
источник
2

Я использовал вышеупомянутое правило для fwd 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]
Люк
источник
Вам нужно разместить правила перенаправления без www перед теми, которые вы цитировали.
Владимир Йованович
2

с 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]
Раджит Рамачандран
источник
2
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

в

И SSL

в

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

<if "%{HTTP_HOST} =='www.example.com'">
Redirect / http://example.com/
</if>
starkeen
источник
2

использование: 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

$.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);
        }
    }
});
antimalwareprogram
источник
1

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

RewriteEngine On
RewriteCond %{HTTP_HOST} ^site\.ro
RewriteRule (.*) http://www.site.ro/$1 [R=301,L]
sulfy
источник
1

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

RewriteEngine On
RewriteBase /

### Force WWW ###

RewriteCond% {HTTP_HOST} ^ пример \ .com
RewriteRule (. *) Http://www.example.com/$1 [R = 301, L]

## Принудительно SSL ###

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

## Блокировка IP-адресов ###
Заказать Запретить, Разрешить
Запретить с 256.251.0.139
Запретить с 199.127.0.259
таинственность
источник
Apache может прослушивать другой порт, например, 81. Поэтому вместо того, RewriteCond %{SERVER_PORT} 80чтобы предложить более универсальную проверку, я предлагаю:RewriteCond %{HTTPS} off
Andron
1

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

RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ http://%1%{REQUEST_URI} [L,R=301]
Luky
источник
1

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

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

CNAME   r.simpleredirect.net
A       89.221.218.22

Больше информации: https://simpleredirect.net

Бобик
источник
0

Я не уверен, почему вы хотите удалить 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 в исходную среду.

местный
источник
2
Должен ли субдомен www быть включен или нет - это вопрос личных предпочтений, который может зависеть от имени домена и целевой аудитории. Общий код, размещенный выше для перенаправления www на none-www, также обрабатывает тестовые среды в порядке, так как перенаправление происходит только когда "www." субдомен встречается.
MrWhite
1
Этот вопрос противоположен тому, что задает пользователь, который только загрязняет сообщение.
Вадим
0

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

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

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

Опция NoCase для шаблона без регулярных выражений '-f' не поддерживается и будет игнорироваться

Уильям Энтрикен
источник
Предыдущий ответ не нуждался в «обновлении для работы на Apache 2.4». «Предупреждение», которое вы цитируете (AH00665), относится к другой директиве (например, если у вас было что-то подобное RewriteCond %{REQUEST_FILENAME} !-f [NC]). NCФлаг делает небольшое различие в приведенном выше, однако, поэтому NCфлаг должен быть использован здесь , чтобы поймать небольшую часть бот трафика , который (неправильно) посылает в верхнем регистре имя хоста.
MrWhite
0

Добавлен, если localhost, игнорировать перенаправление (для целей разработки в локальной среде). Если не localhost AND (не https ИЛИ это www), перенаправьте на https и non-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]
Джеф Гилберт
источник
Пожалуйста, разработайте свой код, чтобы ОП понимал, как это отвечает на вопрос.
RyanNerd
-2

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

RewriteEngine On
RewriteCond %{HTTP_HOST} ^example.com
RewriteRule (.*) http://www.example.com/$1 [R=301,L]
Чираг Парех
источник
Вопрос в том, чтобы задать «общее» решение, которое не включает доменное имя. Ваше решение также делает полную противоположность тому, что запрашивается в вопросе (не с www на www, а не с www на non-www) без объяснения причин.
MrWhite