Для работы данного способа у вас в Apache должен быть включён модуль mod_rewrite. Если при добавлении указанных ниже строк вы получаете 500 ошибку — скорее всего дело в отсутствии данного модуля. Также проверьте кодировку: она должна быть UTF-8 без BOM или ANSI. Ещё возможны проблемы с неверным типом перевода строки: он должен быть или Win, или Unix, и ни в коем случае не Mac! Кодировки и перевод строки можно смотреть и настраивать в Notepad++.
Итак, начнём. Для начала открываете (или создаёте новый) .htaccess файл в корне сайта и ищете там следующие строки, если нет — добавляете в конец:
- Код: Выделить всё
RewriteEngine On
RewriteBase /
Принудительный редирект с субдомена www на обычный (простой способ для HTTP и стандартного порта):
- Код: Выделить всё
RewriteCond %{HTTP_HOST} ^www\.(.*) [NC]
RewriteRule ^(.*)$ http://%1%{REQUEST_URI} [R=301,L]
Если ваш сайт работает по HTTPS или на каком-то нестандартном порту, вам пригодится более мощный способ удаления www:
- Код: Выделить всё
# В переменную окружения %{ENV:PROTOCOL} помещаем протокол
RewriteRule ^(.*)$ - [E=PROTOCOL:http]
RewriteCond %{HTTPS} ^on$ [NC]
RewriteRule ^(.*)$ - [E=PROTOCOL:https]
# Если нужно убираем www
RewriteCond %{SERVER_PORT} ^80$
RewriteCond %{HTTP_HOST} ^www\.(.*) [NC]
RewriteRule ^(.*)$ %{ENV:PROTOCOL}://%1%{REQUEST_URI} [R=301,L]
RewriteCond %{HTTP_HOST} ^www\.(.*) [NC]
RewriteRule ^(.*)$ %{ENV:PROTOCOL}://%1:%{SERVER_PORT}%{REQUEST_URI} [R=301,L]
Принудительный редирект с обычного домена на субдомен www (простой способ для HTTP и стандартного порта):
- Код: Выделить всё
RewriteCond %{HTTP_HOST} !^www\.(.*) [NC]
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
Для сайтов, доступных по HTTPS или на нестандартных портах также есть возможность принудительного добавления www:
- Код: Выделить всё
# В переменную окружения %{ENV:PROTOCOL} помещаем протокол
RewriteRule ^(.*)$ - [E=PROTOCOL:http]
RewriteCond %{HTTPS} ^on$ [NC]
RewriteRule ^(.*)$ - [E=PROTOCOL:https]
# Если нужно добавляем www
RewriteCond %{HTTP_HOST} !^www\.(.*) [NC]
RewriteCond %{SERVER_PORT} ^80$
RewriteRule ^(.*)$ %{ENV:PROTOCOL}://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
RewriteCond %{HTTP_HOST} !^www\.(.*) [NC]
RewriteRule ^(.*)$ %{ENV:PROTOCOL}://www.%{HTTP_HOST}:%{SERVER_PORT}%{REQUEST_URI} [R=301,L]
Если у вас кривой хостинг, позволяющий открывать сайт с любым количеством www перед доменом (www.www.www.example.com), избавиться от них можно также одним редиректом. Этот код нужно устанавливать вместо указанных выше, а не в дополнение к ним!
Версия с удалением всех www в адресе (для HTTP и стандартного порта):
- Код: Выделить всё
RewriteCond %{HTTP_HOST} ^(www\.)+(.*) [NC]
RewriteRule ^(.*)$ http://%2%{REQUEST_URI} [R=301,L]
Версия с сохранением одного www в адресе (для HTTP и стандартного порта):
- Код: Выделить всё
RewriteCond %{HTTP_HOST} ^www\.(www\.)+(.*) [NC]
RewriteRule ^(.*)$ http://www.%2%{REQUEST_URI} [R=301,L]
Для исключения возникновения 500 ошибок при отсутствии mod_rewrite можно все инструкции для этого модуля разместить в блоке:
- Код: Выделить всё
<IfModule mod_rewrite.c>
# Инструкции для mod_rewrite здесь
</IfModule>
То есть в результате, например, для простого способа удаления www из адреса у вас должно получиться что-то вроде:
- Код: Выделить всё
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} ^www\.(.*) [NC]
RewriteRule ^(.*)$ http://%1%{REQUEST_URI} [R=301,L]
</IfModule>