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

433

Я хотел бы перенаправить 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
  • 2
    Еще одна вещь, которую нужно учитывать, убедитесь, что вы устанавливаете каноническое имя без www на своих страницах, чтобы избежать возможного штрафа за дублирование контента. Также, если у вас есть абсолютные URL в ваших ссылках, убедитесь, что они все не-www.
Показать ещё 3 комментария
Теги:
mod-rewrite
url-rewriting

21 ответ

809
Лучший ответ
RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ http://%1/$1 [R=301,L]

То же, что Майкл, за исключением этого: P

  • 16
    Если это не работает, возможно, вам не хватает предшественника RewriteEngine On чтобы заставить его работать.
  • 8
    @ Бен, как бы я использовал это наоборот, чтобы добавить www на сайт без www?
Показать ещё 12 комментариев
105

Но если нам нужно сделать это для отдельных 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]
  • 1
    www.example.com/ перенаправляет на example.com// Любой способ удалить лишнюю косую черту?
  • 0
    Хороший вопрос. Я полагаю, что быстрое решение будет заключаться в использовании дополнительных правил (т.е. только для этого случая), прежде чем они описаны выше. Например: RewriteCond %{HTTPS} off RewriteCond %{HTTP_HOST} ^www.example.com/$ [NC] RewriteRule ^(.*)$ http://www.example.com [R=301,L] ...
Показать ещё 2 комментария
69

Перенаправить не-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]
  • 0
    Не работает для меня Тот от Андрона работает.
  • 4
    @nightcoder Это потому, что мое решение для обратного перенаправления (с не-www на www) в отличие от Andron's
Показать ещё 3 комментария
42

Если вы хотите сделать это в файле 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

33

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

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

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

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

  • 0
    Вы можете написать код для перенаправления http на https вместе с перенаправлением www на не-www
11
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^/(.*)$ http://%1/$1 [R]

RewriteCond захватывает все в переменной HTTP_HOST после "www". и сохраняет его в% 1. RewriteRule захватывает URL-адрес (без имени "/" ) и сохраняет его в $1.

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

Попробуйте следующее:

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

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

  • 1
    Роборг, к сожалению, твои настройки не работают, если я попробую это: example.com/hello/world, я окажусь здесь: example.com/hello/world/world Мне также пришлось добавить косую черту после% {HTTP_POST} в Первый RewriteRule
  • 1
    У меня работает нормально (на Apache 2)
Показать ещё 3 комментария
6

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

RewriteEngine On

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

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

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

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

5

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

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

  • Generic. Не требуется информация о домене.
  • Заставляет WWW в основном домене: www.domain.com
  • Удаляет WWW на поддоменах: sub.domain.com
  • Сохраняет статус HTTP/HTTPS.
  • Разрешает отдельные файлы 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]
  • 0
    Исходный вопрос просит перенаправить www на не- www . Вы заставляете включение www .
3

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

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]
  • 0
    Работал как драгоценный камень! Спасибо
3

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

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

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

/site/location/.htaccess 
  • 0
    Этот пример protossl - вы не устанавливаете protossl среды protossl (это не стандартная переменная / переменная сервера). Это всегда будет пустым, поэтому всегда будет перенаправлять на http . (Идея, лежащая в основе установки protossl ранее в коде, заключается в том, когда вы хотите сохранить протокол при перенаправлении. Однако, в эти дни вам, вероятно, следует постоянно перенаправлять на https .)
3
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ http://%1/subfolder/$1 [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.* вы можете выполнить это, используя директиву Redirect с if,

<if "%{HTTP_HOST} =='www.example.com'">
Redirect / http://example.com/
</if>
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]
  • 0
    Вам нужно разместить правила перенаправления без www перед теми, которые вы цитировали.
1

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

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

Если вы форсируете 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 ###
Order Deny,Allow
Deny from 256.251.0.139
Deny from 199.127.0.259
  • 0
    Apache может прослушивать другой порт, например 81. Поэтому вместо RewriteCond %{SERVER_PORT} 80 я предлагаю использовать такую более универсальную проверку: RewriteCond %{HTTPS} off
1

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

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

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

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

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

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

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

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

Единственное изменение vs Michael's заключается в удалении [NC], который вызывает ошибку "AH00665":

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

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

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню