PHP - Урок 8. Точка входа в приложение. Настройка mod_rewrite и файл .htaccess
Предыдущие уроки:
Программируем на PHP - Введение
PHP - Запросы от браузера к серверу
PHP - Как работает сервер
PHP - Урок 4. PHP - интерпретатор
PHP - Урок 5. Переменные сервера и глобальные переменные
PHP - Урок 6. Конструкции print и echo. Кавычки одинарные и двойные и конкатенация строк
PHP - Урок 7. Переменные, константы и условия
Кое что важное чуть не забыл. Прежде чем переходить к написанию каркаса будущих сайтов и оператору switch - следует кое-что под настроить.
На многих сайтах можно встретить красивые URL в адресной строке.
Например они могут выглядеть так http://thesite.loc/my_article/mod_rewrite
Однако, если мы наберем эту ссылку в нашем тестовом сайте, то сервер apache будет искать папку my_article/mod_rewrite
Если эта папка бы была и в ней находился файл index.php (или index.html), то мы бы и увидели в браузере его (результат его работы).
Однако у нас будет динамический сайт (новостной блог, интернет магазин, социальная сеть и все вместе :))
Мы не будем создавать файлы таким образом. А расположим их в и библиотеках ядра нашего php-сайта (приложения).
А все запросы будем направлять на единственный корневой файл - index.php
Для этого нам понадобится подключенный модуль mod_rewrite. В нашем денвере он уже подключен.
На многих хостингах он также по умолчанию настроен.
Однако если у вас возникнут проблемы на реальном сервере следует проверить его настройки.
В файле сервера /etc/httpd/conf.modules.d/00-base.conf Например так:
[root@centos ~]# cd /etc/httpd/conf.modules.d
[root@centos conf]# ls
httpd.conf magic
[root@centos conf]# vi 00-base.conf
И разкомментировать там строчку LoadModule rewrite_module modules/mod_rewrite.so
- убрать #
из ее начала.
Затем перезапустить сервер apache - systemctl restart httpd
Теперь когда все готово заходим в папку с нашим сайтом и создаем там в папке с сайтом (в нашем тестовом примере home/thesite.loc/www
) файл .htaccess с таким содержимым
(Если вы работаете с денвером не забудьте его запустить)
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .* index.php [L]
Здесь первая строчка говорит что ссылки должны обрабатываться модулем mod_rewrite.
Вторая говорит, что если запрашиваемый в URL файл действительно есть в папке с сайтом - то его возвращать как обычно и не задействовать переадресацию на index.php
Третья инструкция аналогична второй но действует для директорий.
Четвертая RewriteRule .* index.php [L]
говорит, что все ссылки следует адресовать на файл index.php.
Что мы получили в итоге - а то что у нас теперь никогда не будет 404 Not Found (если мы сами его не придумаем).
Если файла или папки на нашем сайте не существует - то мы попадем на главный его файл index.php (точку входа в наше PHP-приложение).
Кстати не забудьте создать рядом c .htaccess (в корневой папке) собственно файл index.php
И напишем в нем например <h1>Это мое PHP-приложение</h1>
Теперь переходим в адресную строку браузера и набираем любые названия после адреса сайта через слеш, например http://thesite.loc/fgghh
Мы всегда будем попадать на файл index.php и видеть нашу надпись "Это мое PHP-приложение"
Однако если мы создадим в папке сайтом подпапку или файл - то сервер выдаст нам именно их, а не index.php это работа команд RewriteCond
Помните в прошлых уроках мы создали файл test.php - попробуйте запросить его http://thesite.loc/test.php
Тут отработает именно этот файл и вы получите его результат, а не index.php
Однако если вы запросите не существующий файл, например http://thesite.loc/test1.php
то вас выведет на index.php, но не на страницу ошибки 404
Теперь самое главное. Зачем нам нужна такая точка входа.
Просто мы будем использовать запросы из адресной строки по-своему. Динамически. А не так как это делает сервер по умолчанию.
Прежде всего давайте посмотрим переменные сервера из глобального массива $_SERVER:
Добавим в файл index.php следующий код
<pre>
<?php
print_r($_SERVER);
(чтобы много не писать можно не закрывать теги - это иногда полезно :))
Функция print_r выведет массив переменных процесса сервера (то есть его окружение) и другую информацию о его работе (настройках)
Нас здесь чаще всего будет интересовать в этом массиве значение REQUEST_URI
Он содержит строку запроса, которую мы набираем после адреса нашего сайта.
Теперь давайте вместо просмотра всего массива переменных сервера выведем только нужное нам:
<h1>Это мое PHP-приложение</h1>
Строка запроса:
<?php
echo $_SERVER['REQUEST_URI'];
Теперь если мы введем в адресной строке например http://thesite.loc/hello/world
То увидим на странице соответственно Строка запроса: /hello/world
.
Ну и так соответственно все что наберем там. В этом уроке нам как раз и нужно было это освоить.
Привет!
Этот пост был выбран Академией Голоса и попал в список программы поддержки качественных образовательных постов.
Ссылка на твой пост будет опубликована в отчете Академии.
Спасибо за полезный контент (ノ◕ヮ◕)ノ*:・゚✧
@academy, скажите, пожалуйста: а такая мелочь, как отсутствие какой-либо ссылки на чужую картинку Академию Голоса не волнует?
Ссылки на чужие картинки на Голосе теперь не нужны? или нужны, но не всем?
Спасибо)
@rusldv, Поздравляю!,
Ваш пост был упомянут в моем хит-параде в следующей категории:
Было бы еще полезно указать и профессиональную терминологию, которую ученик сможет в дальнейшем встретить:
Применительно к данному уроку, единая точка входа в приложение и обработка пришедшего запроса называется роутингом (Route)
Спасибо. Так и назовем функцию, когда вынесем код в ядро (core.php). Это где-то через 2 урока :)