Предыдущие части: IP-адреса и DNS, Ставим Apache, Порты и сокеты, Введение
То, что мы называем "сайт", есть сборник HTML-файлов, хранящихся в одной папке. Каждый файл это отдельная страница сайта, которую мы можем запросить и увидеть в браузере. Например: "главная страница", "новости", "о сайте", "контакты", "регистрация" и т.д.
Браузер каждый раз посылает запрос веб-серверу: пришли мне страницу index.html, или news.html, или about.html. Но что мешает нам открыть таким же образом любой другой файл на компьютере? Например, сказать веб-серверу, чтобы прислал "C:/Мои Документы/Пароли.doc". Очевидно, это было бы небезопасно.
Поэтому у веб-сервера есть ограничение: он может присылать файлы только из той папки, которая задана в качестве корневой для сайта. В нашем случае это папка htdocs, которая находится внутри папки, где был установлен сам сервер. И в ней лежит единственный файл index.html, и мы можем получить только его.
Можно продолжить добавлять туда файлы и создать целый сайт там, но это будет несколько странно, ведь эта папка предназначена для сервера, а не сайта. К тому же вы можете иметь несколько сайтов, и у каждого сайта будет своя папка. Поэтому подготовимся так:
Создайте где-нибудь папку исключительно для сайтов. На Linux это обычно /var/www, ну а мы можем сделать такую:
C:\www
Далее, мы хотим сделать новый сайт, допустим, test. Для него внутри папки www создаём папку test:
C:\www\test
Но сайт содержит не только HTML-документы. Он будет содержать конфигурационные файлы и другие вещи, которые не предназначены для просмотра. Поэтому для документов, которые МОЖНО просматривать, мы делаем ещё одну папку. Её обычно называют web или htdocs или public_html, называйте как хотите. Меня устроит public_html, потому что так она часто называется на хостингах:
C:\www\test\public_html
Вот это и будет новым корнем сайта test. Создайте здесь с помощью текстового редактора файл index.html, и напишите самый минимум HTML-кода:
<html><body><h1>This is Test</h1></body></html>
Теперь нужно отредактировать конфигурационный файл Apache httpd.conf, чтобы задать новый корень сайта.
Нужно найти там параметр DocumentRoot – корень документов. Это не то же самое, что корень веб-сервера.
Как видим, для DocumentRoot используется ранее объявленная переменная SRVROOT, а к ней приписана папка htdocs.
Мы изменим DocumentRoot так: "C:/www/test/public_html"
И также нужно поменять следующий за ним параметр <Directory> (его мы обсудим позже):
После изменения конфигурации веб-сервер нужно перезапустить.
Теперь откроем в браузере наш локальный сайт, используя IP-адрес 127.0.0.1 или имя localhost:
Мы увидели нашу страницу с This is Test.
У нас теперь есть сайт в своей отдельной папке, который мы можем спокойно наполнять документами. Но так как веб-разработчик занимается многими сайтами, что делать, если машина одна, а сайтов несколько?
Было бы неплохо сделать так: если в браузере мы набираем test, то попадаем на сайт, размещённый в папке test, если набираем zdg, то попадаем на сайт в папке zdg, и т.д.
Для этого, во-первых, сделаем ещё один сайт. Так как в будущем мы будем его программировать, то давайте сразу выберем что-то условно полезное. Например, сайт для каталогизации вещей, которые у вас есть. Назовём его catalog.
Сделаем для него отдельную папку: C:\www\catalog\public_html и положим в неё файл index.html с другим содержанием, чтобы отличать:
<html><body><h1>Welcome to Catalog</h1></body></html>
Теперь нужно создать доменные имена test и catalog, чтобы они ассоциировались с адресом 127.0.0.1 и на каждый сайт можно было зайти по имени.
Естественно, мы не можем сделать это официально, изменив таблицу на DNS-сервере. Это не зарегистрированные домены. Но мы можем сделать это локально через файл hosts, который находится здесь:
C:\Windows\System32\drivers\etc\hosts
В оригинале этот файл пустой и содержит только комментарии:
Как видно, с адресом 127.0.0.1 ассоциировано имя localhost, но это делается по умолчанию, поэтому в файле задавать не нужно (хотя и можно). Комментарии можно удалить, и мы добавим свои имена:
127.0.0.1 test
127.0.0.1 catalog
Файл hosts при интернет-запросах всегда проверяется первым, ещё до запроса к DNS-серверу. Поэтому, если в нём найдено имя сайта, адрес сайта берётся из файла hosts, а не от DNS-сервера. Таким методом можно даже перекрывать доступ к реально существующим сайтам. Например, гипотетическая ситуация: вы не хотите, чтобы ваша программа Skype обновлялась. За обновлениями она обращается, допустим, на update.skype.microsoft.com. Вы добавляете в файл hosts запись:
127.0.0.1 update.skype.microsoft.com
И теперь при попытках обратиться за обновлениями программа Skype будет всего лишь попадать на вашу собственную машину, где, понятно, никаких обновлений нет.
Аналогичным образом, когда вы обращаетесь к именам test и catalog, вы будете попадать на собственную машину.
Проверим имя test:
Всё нормально, теперь имя catalog:
И хотя мы видим, что имя catalog сработало, попали мы всё равно на сайт test. Это произошло потому, что что сейчас в Apache настроен только один сайт, и все имена, которые ведут на адрес 127.0.0.1, ведут на этот сайт. Нам же нужно, чтобы каждое имя вело на свой сайт. Но имена преобразуются в адреса, а адрес-то у нас только один. Что делать?
Для этого у Apache есть технология виртуальных хостов. (Хост – это ещё одно название для сервера, сайта и т.п.) Работает она так: Мы попадаем на адрес 127.0.0.1, но при этом в запросе от браузера содержится имя сайта: test или catalog. Аpache видит это имя, и может по нему определить, какой сайт надо открыть. Таким образом, каждый такой сайт существует на одном адресе, но ведёт себя как самостоятельная сущность. Поэтому они и называются виртуальными.
Чтобы сделать виртуальный хост, нужно добавить его в настройки. Настроек у Apache много, и поэтому не все они содержатся в файле httpd.conf, а сгруппированы тематически. Настройки, посвящённые виртуальным хостам, хранятся в файле extra/httpd-vhosts.conf. А этот файл включается в основной файл httpd.conf с помощью директивы Include:
Но эта опция по умолчанию закомментирована, то есть не используется. Поэтому сначала откройте httpd.conf, найдите раздел Virtual hosts и раскомментируйте эту строчку:
Теперь можно открыть extra/httpd-vhosts.conf и добавить туда виртуальные хосты. Первоначально там, кроме комментариев, содержится один хост:
Его DocumentRoot показывает ещё на старый корень документов. Не будем заморачиваться и просто удалим этот хост целиком. После чего добавим свои хосты:
Разберёмся, как это работает. Виртуальный хост задаётся секцией, которая начинается с <VirtualHost> и заканчивается </VirtualHost>.
В заголовке секции написано *:80, это значит, что данный хост активен для соединения на любой IP-адрес на порту 80.
Внутри секции два необходимых параметра: DocumentRoot задаёт корневую папку сайта (с ним мы уже знакомы), а ServerName как раз задаёт имя сервера – либо test, либо catalog.
Веб-сервер, получив запрос, где фигурирует имя catalog, проверяет виртуальные хосты и видит, что нужно использовать папку документов "C:/www/catalog/public_html". Таким образом мы получаем разделение сайтов по именам.
Самый первый виртуальный хост также является хостом по умолчанию, то есть он используется, когда не указано никакое имя (мы обращаемся по 127.0.0.1 или localhost). В нашем случае это должен быть сайт test.
Сервер после изменения конфигурации нужно перезапустить. Также, ранее открывавшиеся страницы могут всё ещё отображаться по-старому, поэтому может потребоваться пару раз нажать кнопку "обновить" в браузере.
Проверим имя localhost:
localhost попадает на test, хорошо. Теперь имя test:
test тоже попадает на test, хорошо. Теперь имя catalog:
Очевидно, мы попали уже не на test, но что-то пошло не так. Apache говорит, что к данному сайту запрещён доступ. И это правда. По умолчанию веб-сервер не пускает на сайт никого. Мы должны сами это разрешить. Почему тогда он пускает на test?
Потому что доступ к test мы уже разрешили раньше, когда редактировали DocumentRoot и следующую за ним секцию <Directory>. Внутри секции <Directory> в оригинальном файле много комментариев, я их уберу, чтобы показать основное:
Эта секция нужна, чтобы задать доступ к папке, причём не к одной. В пределах нашего сайта может быть много папок, и для каждой папки можно сделать свою секцию <Directory> – к одной разрешить доступ, к другой нет, и т.д. В данном случае описана вся корневая папка сайта "C:\www\test\public_html". Поэтому доступ к test работает.
Чтобы не застревать на подробностях, рассмотрим пока главный параметр:
Require all granted
Именно он разрешает доступ к папке. Require это параметр ("требуется"), all значит "всем", granted значит "разрешено", то есть "разрешено всем".
Чтобы разрешить доступ к сайту catalog, нужно открыть httpd-vhosts.conf и добавить в секцию хоста catalog секцию <Directory>, разрешающую доступ к его папке:
Перезапускаем сервер и проверяем ещё раз:
Теперь имя catalog ведёт на сайт catalog.
На этом все настройки закончены, и мы можем приступать к разработке сайта.
Читайте дальше: Основы HTML