Загальне перенаправлення htaccess www на non-www


484

Я хотів би перенаправити www.example.comдо example.com. Наступний код htaccess робить це:

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

Але чи існує спосіб зробити це загальним способом без жорсткого кодування доменного імені?


64
Важливо пам’ятати, що якщо ви не використовуєте www (чи якийсь інший субдомен), усі файли cookie будуть подані на кожен піддомен amd, ви не зможете мати субдомен, що не містить файлів cookie, для подачі статичного вмісту, зменшуючи таким чином кількість даних, що надсилаються назад і назад між браузером і сервером. Щось пізніше ви можете пошкодувати: twitter.com/codinghorror/statuses/1637428313
Сем Хаслер

3
Ще слід врахувати, що ви не встановите на своїх сторінках канонічне ім’я без www, щоб уникнути можливого дублювання покарання за вміст. Також якщо у ваших посиланнях є абсолютні URL-адреси, переконайтеся, що вони також не є www.
Джеремі Морган

На мій погляд, краще зберегти чітке перенаправлення, особливо при копіюванні конфігурації для іншого домену, що може вимагати різної настройки (www домен краще в деяких випадках) weboptimizer.ch/2014/01/redirection-www
snowflake

Будь-яка причина, чому це рішення буде працювати у всіх випадках, крім кореневої URL-адреси? Наприклад, domain.com не піонує на domain.com , тоді як domain.com/page1 перенаправляє на domain.com/page1 .
Джефф Соломон

Якщо ви хочете перенаправити www на не-www, зберігаючи протокол (HTTP або HTTPS), перегляньте це пов'язане питання: Перенаправлення www на non-www, зберігаючи протокол HTTP або HTTPS
MrWhite

Відповіді:


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

Те саме, що Майкл, за винятком цього: P


16
Якщо це не працює, ви, мабуть, не вистачаєте RewriteEngine Onпопередника, щоб змусити його працювати.
хендрі

8
@Ben, як я можу використовувати це в зворотному порядку, щоб додати 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// Будь-який спосіб видалити додаткову косу рису?
Bobby S

Хороше питання. Я думаю, що швидким рішенням буде використання додаткових правил (тобто лише для цього випадку) перед цими описаними вище. Напр .: RewriteCond %{HTTPS} off RewriteCond %{HTTP_HOST} ^www.example.com/$ [NC] RewriteRule ^(.*)$ http://www.example.com [R=301,L] ...
Андрон

3
@BobbyS Я використав рішення в цій статті . Він перенаправляє www і HTTP на не-www HTTPS, а також обробляє трейлінг /.
totymedli

Ви отримаєте додатковий нахил (на початку URL-шляху), якщо ви розмістили ці директиви безпосередньо в конфігурації сервера (або virtualhost). У .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) на відміну від Андрона
Дмитро

2
Примітка: це рішення може спричинити деякі проблеми, якщо ви маєте намір використовувати імена піддоменів для інших цілей. Наприклад, app.yourdomain.com буде переспрямовано на www.app.yourdomain.com.
Marty ZHANG

1
Це якраз протилежна відповідь на запитання.
Іван

Довелося додати RewriteEngine Onі RewriteBase /, але в іншому випадку добре працював.
передумати


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:

#########################
# 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 на non-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(як зазначено у питанні) немає провідних /, тому шаблон ніколи не відповідає, а переадресація ніколи не відбувається. (У контексті сервера або virtualhost є лише провідна коса риса .) Крім того, якщо після цього у вас є якісь директиви 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
RoBorg, на жаль, ваші налаштування не працюють, якщо я спробую це: example.com/hello/world Я закінчую тут: example.com/hello/world/world Я також повинен був додати косу рису після% {HTTP_POST} у First RewriteRule
deepwell

2
Я використовую Apache / 2.2.9 (Unix). Він працює на веб-сайті www.website, який переспрямовує на веб-сайт, але для наступного: веб-сайт / тест -> переходить до: websitetest Я це виправив, додавши ще одну / Другу помилку: веб-сайт / тест / n переходить на websitetest / n / n
deepwell

1
Те саме, що і @deepwell з цим.
neemzy

Проблеми, які виникають у попередніх читачів, полягають у тому, що ці директиви призначені для конфігурації сервера (або vhost), а не .htaccess. У контексті каталогів ( .htaccess) слід змінити перше RewriteRuleчитання: RewriteRule ^(.*)$ %{HTTP_HOST}/$1 [C,DPI](потрібен Apache 2.2.12+). Зверніть увагу на додавання косої риски та DPIпрапор (Інформація про відхилення шляху), щоб не допустити дублювання частини URL-шляху (що насправді є "інформацією про шлях"), як зазначено в попередніх коментарях. Однак існують і більш прості директиви - як описано в інших відповідях.
Містер Білий

7

Повний загальний обробник 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]

Оригінальне запитання просить перенаправити wwwна не www. Ви змушуєте включити www.
Вадим

6

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

RewriteEngine On

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

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

(Переконайтесь, що між кожним рядком тексту немає пробілів рядків; я додав додатковий пробіл між рядками, щоб воно було добре в цьому вікні.)

Це один фрагмент коду, який можна використовувати для перенаправлення www-версії вашого сайту до http: // версії. Є й інші подібні коди, які також можна використовувати.


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

Для підпапки


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 або non-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

Я використав вищезазначене правило, щоб перетворити файл 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.*ви можете досягти цього за Redirectдопомогою ifдирективи,

<if "%{HTTP_HOST} =='www.example.com'">
Redirect / http://example.com/
</if>

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({
    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);
        }
    }
});

1

Єдиний спосіб, коли я змусив його працювати ...

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

1

Якщо ви змушуєте www. в URL-адресі або форсуванні протоколу ssl, тоді спробуйте використовувати можливі варіанти файлу htaccess, такі як:

ПереписатиEngine On
RewriteBase /

### Сила WWW ###

ПерепишітьCond% {HTTP_HOST} ^ example \ .com
Перезаписати (. *) Http://www.example.com/$1 [R = 301, L]

## Force SSL ###

ПерепишітьCond% {SERVER_PORT} 80 
Перепишіть ^ (. *) $ 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]

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 І (не 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-не-www) без пояснень.
Містер Білий
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.