03.06.2009
Отказ от префикса www
Делаю на всех своих проектах перенаправление «www → без www». Делается это элементарно, через создание файла .htaccess с директивами для сервера. Например, для orss.ru:
RewriteEngine On
Options +FollowSymlinks
RewriteCond %{http_host} ^www.orss.ru [NC]
RewriteRule ^(.*)$ http://orss.ru/$1 [R=301,NC]
Теперь пояснение, зачем это нужно. Собственно, аргументы тут остаются одинаковыми уже много лет. «Префикс www для написания доменного имени — не является технической необходимостью. Когда-то давно, когда протокол http не был так распространен как сегодня, приставкой www пользовались для того чтобы указать на принадлежность адреса к интернет-пространству, названному World Wide Web (WWW)» — пишут nowww.ru.
Почему же тогда я и многие другие годами делали перенаправление наоборот, «без www → www»? Потому что еще 5 лет назад люди просто не узнавали надписи вроде «perfectomania.com». А вот «www.perfectomania.com» — узнавали. Даже «http://» служило менее узнаваемым префиксом. Более того, диктуя, например, в эфире телевидения адрес сайта — «http://» редко произносилось. Чтобы указать на то, что это диктуется адрес в Сети — произносилось «www». Собственно и сейчас в большинстве случаев делается именно так.
Так вот, чтобы не путать неискушенных и не создавать два пространства URL-адресов, многие и делали обратное перенаправление. Что же изменилось сейчас? Для меня ответ простой — не узнавать в 2009 году адрес вида «perfectomania.com» исключительно по окончанию «.com» — это уже стыдно даже для среднего обывателя. Поэтому, поддерживать устаревшую форму больше нет никакого смысла.
Теги (в разработке): интернет в целом, проектирование сайтов
Есть небольшой недостаток – после такого редиректа ты потеряешь якорь :-)
Да и про аргументы $_GET ты, кстати, забыл.
zerkms, а можно подробнее про якорь и GET? Буду благодарен.
Обсолютно згідний лишній раз писати WWW немає потреби, але ще є допотопні сайти на котрі не попасти без цього префікса. От як сайт колишнього провайдера http://www.bit.te.ua чи http://www.profoto.te.ua котрий в мережі того ж провайдера.
Если в урле у тебя будет часть ?a=b&c=d то вышеприведённые правила их похерят
[R=301,NC,QSA]
http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html#rewriteflags
zerkms, так вроде таких не предвидится. Вообще да, нужно подучить директивы эти, плохо их знаю.
http://perfectomania.com/?s=%D0%BF%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%BA%D0%B0
м? :-)
zerkms, о, спасибо :)
А как это исправить? :) (сейчас сам попробую)
про якорь кстати забыл. если в урле будет якорь
http://perfectomania.com/blog/2009/06/no-www/#comment-127581
вот как в урле выше, то подобный редирект этот якорь потеряет. потому как якорь вообще не передаётся браузером на сервер.
я же во 2 своём посте дал ссылку на директивы и поправил, дописав ещё одну, которая отвечает за query string.
zerkms, сделал QSA. Теперь проблема в русских символах, которые заменяются на «%EF%F0%EE%E2%E5%F0%EA%E0». Пробую директиву NE — глючит.
http://localhost/aaaaaaa?s=%EF%F0%EE%E2%E5%F0%EA%E0
с правилом
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteRule (.*) index.php [QSA]
и
var_dump($_GET);
выводит array(1) { ["s"]=> string(8) «проверка» }
Данное рассуждение верно только если единственный предоставляемый сервис — это web. Однако, не все так однозначно, если сервисов несколько.
Если у нас есть организация, ее домен — example.com, и у этой организации есть несколько серверов, выполняющих разные функции, то вполне логично, что их внешне видимые имена будут соответствующими:
http://www.example.com — web-сервер,
http://ftp.example.com — FTP-сервер,
svn.example.com — сервер Subversion,
xmpp.example.com — сервер XMPP (Jabber)
и т.д.
В идеале было бы неплохо, если бы все клиенты обращались по одному имени example.com (без всяких префиксов) и получали нужные им сервисы, но реализовать это в общем случае не так просто.
Для SMTP (протокола доставки email) эта проблема давно уже решена: в доменной системе имен (DNS) есть специальные записи «MX», с помощью которых можно задавать, куда доставлять почту для данного домена.
Для других сервисов в DNS’е есть записи «SRV», с помощью которых можно задавать сервера и порты к которым обращаться за сервисом. Проблема в том, что эти записи были введены слишком поздно, и никто их не использует кроме клиентов XMPP (Jabber), да и то не всех. Все остальные клиенты (в том числе, и web browser’ы) просто используют запись «A», которая задает соответствие имени адресу IP (или «AAAA» для IPv6).
Единственное работающее на данный момент решение — это сделать все сервисы доступными на одном адресе IP и повесить на этом адресе переписывание пакетов (port forwarding), чтобы соединения, предназначенные для разных сервисов, перенаправлялись на разные физические сервера. Такое решение требует дополнительных затрат на установку и администрирование, а также создает «слабое звено» (single point of failure): если устройство, занимающееся перенаправлением соединений, выйдет из строя, будут недоступны сразу все сервисы.
Таким образом, доменный префикс «www» (и другие подобные доменные префиксы) появились потому, что изначально в доменной системе имен был недостаток, а исправлен этот недостаток был слишком поздно. Пока все web browser’ы не будут использовать записи «SRV», префикс «www» не изжить.
Кстати, переписывать доменные имена в коментариях, превращая их в URL’ы и добавляя префикс «http://» — это не очень хорошая практика. К чему это приводит, можно видеть в предыдущем коментарии.
http://www.google.com/reader/view/?tab=my
У меня всё.
ForJest, че?
Ну конечно. Что мешает example.com сделать под HTTP, а все остальные сервисы – с «префиксами»?
А почему именно HTTP, а не FTP или XMPP?
Кстати, не только разные сервисы могут быть с разными префиксами, но и один сервис, предоставляющий контент по разным темам.
Например:
http://www.example.com — web-сайт,
shop.example.com — электронный магазин,
forum.example.com — web-форум
и т.п.
Похожую по принципу систему именования использует Google для своих сайтов.
Олег Гирько, я думаю ForJest имеет в виду, что почему не
http://example.com — web-сайт,
http://shop.example.com — электронный магазин,
http://forum.example.com — web-форум
По той же по самой причине, по которой вбитое в браузер доменное имя будет снабжается протоколом http://
Опять же, давайте сходу определим, за какой сервис отвечает домен с «префиксом»: deniskin.habrahabr.ru?
Тогда уж более логично было бы иметь
http://example.com/ — основной сайт,
http://example.com/shop/ — магазин,
http://example.com/forum/ — форум.
По крайней мере, я бы делал так. Но это все — один сервис: HTTP. Проблема возникает когда мы хотим иметь несколько разных сервисов.
Если не использовать решение с port forwarding’ом, которое я упомянул выше, получим:
http://example.com/
но:
ftp://ftp.example.com/
svn://svn.example.com/
и т.д.
Почему это сервис HTTP должен быть каким-то особенным?
Такая позиция имеет право на жизнь для блога, но для крупного коммерческого проекта – увы нет. Я уверен, что использование в наружке, по радио и другими не интерактивными каналами адреса без www уменьшит долю тайп-ин траффика на весомый процент.
Иван Кучеренко, сейчас блоги, не большие проекты. Через пару лет — и большие тоже.
я голосую за http.example.com
Всё так и было до недавнего времени. Но тут появился Google App Engine. Вы пробовали привязать кастомный домен к нему? Я пробовал. Без www — никак. Мало того, без www вообще не работает. Думается, что отныне такие «облачные» платформы запуска будут только развиваться, а в них все эти доменные дела выглядят несколько иначе.
Не вижу логической связи. Для browser’а как раз протокол HTTP особенный. А вот для домена — нет.
Да буквально за какой угодно. Если ввести это доменное имя в строке адреса в browser’е, он попытается обратиться по адресу, соответствующему этому имени, по протоколу HTTP. А если передать это имя клиенту FTP, он попытается обратиться по протоколу FTP.
Что-то не так с автоподстановкой на этом сайте. Можно понять (но не оправдать), когда «http://» дописывается в начале чего-то, похожего на доменное имя. Но когда это дописывается к слову «FTP», заканчивающемуся точкой, единственным логическим объяснением является ошибка в программе. Это еще одно подтверждение правила: когда пытаются сделать программу, которая должна догадываться, что имел в виду пользователь, в большинстве случаев эта программа будет догадываться неверно.
Ты победил. Всё. На example.com с завтрашнего дня все обязаны ставить XMPP. Если нету XMPP, то хотя бы FTP. HTTP – вне закона.
Yahoo! не рекомендует убирать www