Сейчас практически на любом веб-сайте существует такой раздел, как «Новости сайта». В нем публикуются новости, каким-либо образом связанные с работой сайта: добавление новых материалов, появление новых сервисов, пополнение в команде сайта – все это находит отражение в «Новостях сайта». Другими словами, при помощи новостей владелец сайта показывает посетителям историю развития своего веб-сайта.

У вас тоже есть свой веб-сайт? И вы публикуете на нем новости? Согласитесь, было бы очень неплохо несколько автоматизировать процесс работы над новостями (добавление, изменение, удаление). Об этом я и расскажу. В статье будет подробно рассмотрен вопрос создания достаточно простого скрипта на языке веб-программирования PHP для отображения новостей на сайте. Информация (в данном случае это – текст новостей) хранится на сервере, к ней можно обращаться при помощи скриптов.

Существует две возможности хранения информации на сервере – в виде текстовых файлов и с использованием баз данных (в Интернете чаще всего используется СУБД MySQL, она поддерживается практически всеми платными хостингами, да и многими бесплатными).
Для новичка в PHP лучше работать с текстовыми файлами. Это и проще, и нагляднее. Всегда можно просто открыть текстовый файл «вручную» и посмотреть, что в нем хранится.
Но для более-менее серьезных проектов гораздо практичнее использовать базы данных. Сами посмотрите – все более-менее серьезные общедоступные скрипты форумов вроде phpBB, Invision Power Board, VBulletin, используют для хранения информации именно базы данных.
Почему? При использовании даже для небольших веб-проектов у баз данных есть ряд преимуществ по сравнению с текстовыми файлами. Например:

1. Несравненно более быстрый доступ к информации, чем тот, который обеспечивают «обычные» текстовые файлы

2. При помощи SQL-запроса достаточно просто сделать поиск данных в таблицах базы данных

3. Многопользовательский доступ. При использовании баз данных не стоит беспокоиться о том, что к одному файлу для перезаписи могут одновременно обратиться два и более посетителей. Для предотвращения подобных сутаций при работе с текстовыми файлами используют блокировку файла для записи, что необходимо программировать самому разработчику.

Это далеко не все преимущества использования баз данных. В небольших проектах допустимо использовать текстовые файлы, однако если планируется создать большой и посещаемый проект – без баз данных не обойтись.

Скрипт новостей, описанный в этой статье, использует для хранения информации СУБД MySQL.

Для того, чтобы все приведенные в статье скрипты заработали на вашем компьютере без подключения к Интернету, у вас должен быть установлен локальный веб-сервер Apache с поддержкой PHP и MySQL.

Если же у вас на компьютере еще не установлен Apache, то самое время сделать это. Самому установить веб-сервер и настроить его правильную работу – достаточно сложная работа.
Могу вам посоветовать в таком случае воспользоваться комплектом «Денвер» (http://www.denwer.ru) – расшифровывается как «Джентельменский набор веб-разработчика». Это инсталлятор уже полностью настроенного веб-сервера Apache с поддержкой PHP, Perl и MySQL. Размер инсталлятор «Денвера» всего около 2 мегабайт (для сравнения – по отдельности дистрибутивы Apache, PHP, Perl и MySQL весят около 20 мегабайт!).

Установить веб-сервер с помощью «Денвера» не составит никакого труда. О процессе инсталляции подробно написано на сайта «Денвера». Кроме того, о дальнейшей работе с веб-сервером, установленным при помощи «Денвера», можно прочитать в статье, находящейся по адресу http://webmastak.com/tech/apache/129/denwer.html. Кроме того, после установки «Денвера» по адресу http://localhost/ также можно прочесть немало полезных советов

Если же вы не владеете приемами использованием MySQL при работе с PHP – могу посоветовать отличную книгу по этой теме, которая так и называется: «Разработка web-приложений на PHP и MySQL» (авторы: Люк Веллинг и Лаура Томсон, издательство «Диасофт», 2003).
Либо поищите в Интернете информацию на эту тему, например, на таких сайтах, как http://www.webmastak.com, http://www.webscript.ru, http://www.codenet.ru/webmast/php/
Так, с подготовкой к работе вроде бы закончили, теперь приступим непосредственно к написанию скриптов.

Для начала разберемся с самим процессом работы над модулем новостей.

1. Создаем таблицу в базе данных, заполняем ее тестовой информацией, пишем клиентскую часть, которая отвечает за вывод новостей на страницах сайта

2. Пишем администраторскую часть модуля новостей, которая отвечает за добавление, редактирование и удаление новостей из БД

3. Под конец я расскажу, какими стандартными методами можно защитить модуль администрирования новостей

Итак, начнем писать клиентскую часть новостного раздела.
Сначала определимся, что мы хотим в ней видеть. Как я считаю, она должна выполнять минимум три функции:

1. Выводить N последних новостей на главной странице сайта

2. Выводить нужную новость по запросу

3. Выводить перечень всех новостей (например, в разделе «Новости сайта») с выдачей результатов постранично (допустим, по 10 новостей на страницу)

Теперь давайте определимся со структурой таблицы с новостями в базе данных.

SQL-запрос для создания таблицы NEWS:

1
2
3
4
5
6
7
8
CREATE TABLE `news` (
  id int(11) NOT NULL auto_increment,
  tema varchar(200) NOT NULL default '',
  author varchar(100) NOT NULL default '',
  date date NOT NULL default '0000-00-00',
  text text NOT NULL,
  PRIMARY KEY  (id)
) TYPE=MyISAM;

Выполните это SQL-запрос, например, при помощи утилиты phpMyAdmin (на домашнем веб-сервере phpMyAdmin обычно располагается по адресу http://localhost/phpmyadmin/). В результате выполнения этого запроса будет создана таблица NEWS с следующими полями: ID (уникальное автоинкрементное поле), TEMA (тема новости), AUTHOR (автор новости – если новости на сайт добавляет не один человек, а несколько), DATE (дата добавления сообщения в формате год-месяц-день, например, 2005-09-01 – 1 сентября 2005) и TEXT (текст самой новости).

Давайте вставим несколько пробных новостей в эту таблицы, чтобы этими тестовыми данными можно было пользоваться во время настройки скрипта новостей.

SQL-запрос для вставки нескольких тестових новостей:

1
2
3
4
5
6
7
8
INSERT INTO `news` VALUES (1,’Тема 1’,’Автор сайта’,’23.08.2005’,
’Это пробный текст первой новости<p>Текст после абзаца’);
INSERT INTO `news` VALUES (2,’Тема 2’,’Приятель автора сайта’,’24.08.2005’,
’Это пробный текст второй новости<p>Текст после абзаца’);
INSERT INTO `news` VALUES (3,’Тема 3’,’Знакомый приятеля автора
 сайта’,’25.08.2005’,’Это пробный текст третьей новости
 
<p>Текст после абзаца’);

После выполнения этого SQL-запроса в таблице NEWS будет создано три записи, то есть три новости, которыми можно «манипулировать» во время создания и настройки скрипта.

Модуль отображения новостей на сайте

Теперь внимательно изучите исходный текст скрипта, отображающего новости у посетителя сайта.

Листинг файла news.php:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
<?
 
// Подключение к базе данных
 
@$db=mysql_connect('localhost','имя-пользователя-БД','пароль-пользователя-БД');
mysql_select_db('имя-базы-данных');
 
// Число выводимых новостей на страницу
 
$per_page=10;
 
/*
Извлекаем параметры из строки запроса news.php?***
Символ @ подавляет возможное предупреждение интерпретатора
PHP, если этого параметра  нет в строке запроса
*/
@$action=$_GET['action'];
@$id=$_GET['id'];
 
/*
Если значение $action определено, а $id – не определено
*/
 
if (!$id && $action){
 
/*
При помощи этих строк мы подсчитываем число записей в таблице NEWS,
смотрим, чему равно значение параметра $page, извлекаемое также из строки запроса,
 и выводим 10 новостей (поскольку $per_page=10), соответствующих номеру
 страницы. Иными словами, осуществляется постраничный просмотр новостей –
не выдавать же посетителю все 100 новостей (если у вас на сайте будет 100 новостей)
 на одной странице
*/
if (isset($_GET['page'])) $page=($_GET['page']-1); else $page=0;
$start=abs($page*$per_page);
$q="SELECT count(*) FROM `news`";
$res=mysql_query($q);
$row=mysql_fetch_row($res);
$total_rows=$row[0];
$num_pages=ceil($total_rows/$per_page);
 
/*
А теперь непосредственно выводим перечень самих новостей: заголовок,
текст новости, дату и имя опубликовавшего автора.
Создаем SQL-запрос на вывод 10 новостей – в зависимости от значения
переменной $page
*/
echo '<h1>Новости проекта</h1>';
$sql="SELECT * FROM `news` ORDER BY `id` DESC LIMIT ".($page*$per_page).",".$per_page;
$result=mysql_query($sql);
$num_results=mysql_num_rows($result);
for ($i=0; $i<$num_results; $i++)
    {
    $row=mysql_fetch_array($result);
/*
Записываем в переменные значения нужных полей таблицы NEWS
*/
    $id=$row["id"];
    $author=$row["author"];
    $date=$row["date"];
    $tema=$row["tema"];
    $text=$row["text"];
/*
А теперь выводим
*/
    echo '<b>'.$tema.'</b><br />
 
    <a href="/news/'.$id.'/">Добавил</a>: <b>'.$author.'</b>
 
('.$date.')<p> '.$text.' <hr />';
    }
 
/*
А теперь мы выводим под новостями перечень страниц с новостями,
который выглядит примерно так:
[1-10] [11-20] [21-30]
И так далее – в зависимости от числа новостей
*/
for($i=1;$i<=$num_pages;$i++) {
  if ($i-1 == $page) {
    echo
 
"[".(abs($i*$per_page)-$per_page+1)." - ".abs($i*$per_page)."]  ";
  }
  else {
    echo '[<a
 
href="news.php?action=all&page='.$i.'">'.(abs($i*$per_page)-$per_page+1)." - ".ab
 
s($i*$per_page)."</a>]  ";
  }
}
 
}
 
if (!$action && !$id){
 
$sql="SELECT * FROM `news` ORDER BY `id` DESC LIMIT 0,10";
$result=mysql_query($sql);
$num_results=mysql_num_rows($result);
 
for ($i=0; $i<$num_results; $i++)
    {
    $row=mysql_fetch_array($result);
    $id=$row["id"];
    $author=$row["author"];
    $date=$row["date"];
    $tema=$row["tema"];
    echo '('.$date.') <a href="news.php?id='.$id.'">'.$tema.'</a><p>';
    }
}
 
/*
Если значение $id определено, а значение $action – неопределенно
То есть надо показать посетителю конкретную новость,
хранящуюся в таблице NEWS с ID = $id
*/
if (!$action && $id){
 
$sql="SELECT * FROM `news` WHERE `id`=".$id;
$result=mysql_query($sql);
 
    $row=mysql_fetch_array($result);
    $id=stripslashes($row["id"];
    $author=$row["author"];
    $date=$row["date"];
    $text=$row["text"];
    $tema= $row["tema"];
    echo '<h1>'.$tema.'</h1>
 
    Добавил: <b>'.$author.'</b> ('.$date.')<p> '.$text.' <p>
    <a href="news.php?action=all">? Вернуться к новостям</a>';
 
}
 
?>

У нас получается такая ситуация: при вызове news.php?action=all выводится последние 10 новостей; при вызове news.php?action=all&page=* выводится нужная страница с новостями; при вызове news.php?id=* выводится нужная новость. А чтобы на главную страницу выводить последние 10 новостей, надо просто написать:

1
2
3
<?
include(“news.php”);
?>

Обратите внимание, что текст новости должен быть оформлен в виде HTML-кода, то есть если вам будет нужно сделать перенос текста на новую строку – просто введите
.

Так, с выводом новостей разобрались. Теперь давайте примемся за администраторскую часть.

Модуль администрирования новостей

Листинг файла news-admin.php:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
<?
/*
Число новостей	 на страницу
*/
$per_page=10;
?>
<table cellpadding=2 cellspacing=2>
<tr><td>
<?
@$action=$_GET['action'];
 
switch($action):
 
/*
Если значение $action не определено
*/
case “”:
$action='edit';
break;
 
/*
Если нужно вывести форму для добавления текста новой новости
*/
case “add”:
?>
<form ACTION="news-admin.php?action=insert" METHOD="post">
<table WIDTH="600" BORDER=0 CELLPADDING=4 CELLSPACING=0 ALIGN="center" >
 
<tr><td WIDTH="25%"><b>Тема новости</b></a></td>
<td WIDTH="70%"><input TYPE="text" NAME="tema" SIZE="70"
MAXLENGTH="80" VALUE=""></td></tr>
<tr><td WIDTH="25%"><b>
 
Кто добавил</b></a></td>
<td WIDTH="70%"><input TYPE="text" NAME="author" SIZE="20"
 MAXLENGTH="80" VALUE=""></td></tr>
<tr><td WIDTH="25%"><b>Дата</b></a></td>
 
<td WIDTH="70%"><input TYPE="text" NAME="date"
SIZE="20" MAXLENGTH="80"
VALUE="<?=date("Y-m-d");?>"></td></tr>
<tr><td WIDTH="100%" COLSPAN=2><b>
Текст новости</b></a></td></tr>
 
<tr><td WIDTH="100%" COLSPAN=2 ALIGN="center">
<textarea NAME="text" ROWS="10" COLS=”80”></textarea></td></tr>
 
<tr><td WIDTH="100%" COLSPAN=2 ALIGN="right">
<input TYPE="submit" VALUE="Опубликовать новость">
</td></tr></table>
 
</form>
<?
break;
 
/*
Если нужно вставить текст новой новости в таблицу NEWS
*/
case “insert”:
 
/*
Перед вставкой новости в таблицу базы данных добавляем к
символам ‘ символ  (так называемый слэш, или slash).
Это необходимо для того, чтобы при вставке данных в БД не прозошло ошибки.
В текст, хранимом в БД после записи, не будет символов ’ – после вставки
они автоматически заменятся на ‘
*/
$tema=addslashes($tema);
$author=addslashes($author);
$date=addslashes($date);
$text=addslashes($text);
$sql="INSERT INTO `news`
VALUES ('','".$tema."','".$author."','".$date."','".$text."')";
$result=mysql_query($sql);
if (!$result) {echo "<script>alert('Ошибка при выполнении запроса к
 
БД!');</script>";}
else {echo "<script>alert('Новость добавлена.');</script>";}
echo "<script>self.location.replace('news-admin.php');</script>";
break;
 
case “edit”:
 
/*
Подсчет числа новостей в таблице NEWS и вывод их постранично
*/
if (isset($_GET['page'])) $page=($_GET['page']-1); else $page=0;
$start=abs($page*$per_page);
 
$q="SELECT count(*) FROM news";
$res=mysql_query($q);
$row=mysql_fetch_row($res);
$total_rows=$row[0];
 
$sql="SELECT * FROM `news` ORDER BY `id` DESC LIMIT ".($page*$per_page).",".$per_page;
$result=mysql_query($sql);
$num_results=mysql_num_rows($result);
 
$num_pages=ceil($total_rows/$per_page);
 
echo "<div align=right>";
 
for($i=1;$i<=$num_pages;$i++)
{
  if ($i-1 == $page)
  {
    echo
 
"[".(abs($i*$per_page)-$per_page+1)." - ".abs($i*$per_page)."]  ";
  } else
  {
    echo '[<a
 
href="news-admin.php?page='.$i.'">'.(abs($i*$per_page)-$per_page+1)." - ".abs($i*
 
$per_page)."</a>]  ";
  }
} echo "</div>";
 
echo "<table WIDTH=100% BORDER=0 CELLSPACING=0 CELLPADDING=5>";
 
for ($i=0; $i<$num_results; $i++)
    {
    $row=mysql_fetch_array($result);
    $id=$row["id"];
    $author=$row["author"];
    $date=$row["date"];
    $text=$row["text"];
    $tema=$row["tema"];
 
    echo '
 
    <tr><td COLSPAN=2><b>'.$id.'. '.$tema.'</b>
 
    </td></tr>
    <tr><td COLSPAN=2><b>Автор:</b> '.$author.'
    [<a href="news-admin.php?action=edit-news&id-news='.$id.'">Редактировать
 
новость</a>]
    [<a href="news-admin.php?action=delete&id-news='.$id.'">Удалить новость</a>]
    </td></tr>
 
    <tr><td COLSPAN=2 CLASS=normal>'.$text.'
    </td></tr>
    ';
    }
    echo "</table><br /><div align=right>";
 
for($i=1;$i<=$num_pages;$i++)
{
  if ($i-1 == $page)
  {
    echo
 
"[".(abs($i*$per_page)-$per_page+1)." - ".abs($i*$per_page)."]  ";
  } else
  {
    echo '[<a
 
href="news-admin.php?page='.$i.'">'.(abs($i*$per_page)-$per_page+1)." - ".abs($i*
 
$per_page)."</a>]  ";
  }
} echo "</div><br />";
 
break;
 
/*
Если нужно отредактировать конкретную новость
*/
case “edit-news”:
 
$id_news=$_GET['id-news'];
 
/*
Создаем запрос на вывод конкретной новости (по значению ее поля ID)
*/
$sql="SELECT * FROM `news` WHERE `id`=".$id_news;
$result=mysql_query($sql);
$num_results=mysql_num_rows($result);
 
for ($i=0; $i<$num_results; $i++)
    {
    $row=mysql_fetch_array($result);
    $id=$row["id"];
    $author=$row["author"];
    $date= $row["date"];
    $text=$row["text"];
    $tema=$row["tema"];
 
    echo '
    <form ACTION="news.php?action=update" METHOD="post">
 
    <table WIDTH=600 BORDER=0 CELLSPACING=0 CELLPADDING=4>
    <tr><td width=100>Тема:</td><td> <input TYPE=text NAME=tema
 
VALUE="'.$tema.'" SIZE=80></td></tr>
    <tr><td width=100>Дата:</td><td><input TYPE=text NAME=date
 
VALUE="'.$date.'" size=20>
 
    </td></tr>
    <tr><td CLASS=normal
 
width=100><b>Автор:</b></td><td><input TYPE=text SIZE=20
 
NAME=author VALUE="'.$author.'">
    </td></tr>
 
    <tr><td COLSPAN=2 CLASS=normal><textarea NAME="text" ROWS="15"
 
COLS=80>'.$text.'</textarea>
    </td></tr>
    <tr ALIGN=center><td WIDTH="100%" colspan=2 align=right>
    <input TYPE="hidden" NAME="idup" VALUE="'.$id.'">
 
    <input TYPE="submit" VALUE="Сохранить измененную новость">
    </td></tr></table><br /><br /></form>
    ';
    }
break;
 
/*
Если нужно обновить текст какой-либо новости
*/
case “update”:
 
$tema=addslashes($tema);
$author=addslashes($author);
$date=addslashes($date);
$text=addslashes($text);
 
/*
Создаем запрос для обновления данных в конкретной строке
таблицы NEWS (Эта строка опять же определяется по значению поля ID)
*/
$sql="UPDATE `news` SET
 
`tema`='".$tema."',`date`='".$date."',`text`='".$text."',`author`='".$author."' WHERE
 
`id`='".$idup."'";
$result=mysql_query($sql);
if (!$result) {echo "<script>alert('Ошибка при выполнении запроса к
 
БД!');</script>";}
else {echo "<script>alert('Новость изменена.');</script>";}
echo "<script>self.location.replace('news-admin.php');</script>";
break;
 
/*
Если нужно удалить новость
*/
case “delete”:
 
$tema=addslashes($tema);
$author=addslashes($author);
$date=addslashes($date);
$text=addslashes($text);
 
/*
Создаем запрос на удаление конкретной новости.
Для определения номера этой новости используется поле ID.
Теперь видите, для чего было нужно это поле в таблице NEWS?
*/
$sql="DELETE FROM `news` WHERE `id`='".$iddel."'";
$result=mysql_query($sql);
if (!$result) {echo "<script>alert('Ошибка при выполнении запроса к
 
БД!');</script>";}
else {echo "<script>alert('Новость удалена.');</script>";}
echo "<script>self.location.replace('news-admin.php');</script>";
break;
?>
 
</div></td></tr></table>
<?
endswitch;
?>

Защита файла администрирования новостей логином и паролем для входа

И давайте разберемся с таким вопросом, как защита скрипта администрирования новостей при помощи логина и пароля. Как вы наверное заметили, в самом исходном коде панели администрирования я нигде не использовал авторизацию посетителя. Но поскольку доступ к этой панели должны иметь только вы, то давайте воспользуемся так называемой «серверной аутентификацией».

Как это работает? Сервер запрашивает у посетителя логин и пароль, после чего браузер выводит на экран диалоговое окно, а после ввода логина и пароля передает их на сервер.

Привожу пример. Допустим, мы защищаем папку site.com/admin/ логином и паролем пи помощи серверной аутентификации. И допустим, что посетитель еще не ввел логин и пароль – он только собирается зайти в эту папку. При запросе www.site.com/admin/ у посетителя будет запрошен логин и пароль. И при запросе www.site.com/admin/home.html тоже будет запрошен логин и пароль. И при запросе www.site.com/admin/main/text.php — тоже. Однако если при входе на любую из страниц папки www.site.com/admin/ посетитель ввел логин и пароль, то дальше он может свободно перемещаться по любым документам внутри папки /admin/, логин и пароль у него не будут запрашиваться повторно. Если же посетитель ввел неверную пару «логин – пароль», то ему веб-сервер просто выдаст посетителю стандартную страницу с 401-ой ошибкой (неверная аутентификация).

Закрывается же «сессия работы с защищенной папкой» простым закрытием окна браузера. Просто и удобно.

Так что достаточно поместить файл news-admin.php в каталог /admin/ на вашем сайте и защитить его при помощи серверной защиты, чтобы кроме вас никто не имел к нему доступа.

Как воспользоваться серверной защитой какого-либо каталога? Если вы используете платный хостинг или любой бесплатный, поддерживающий PHP и MySQL, то вы должны иметь доступ к панели управления своим аккаунтом на хостинге. Популярные хостинги narod.ru, nm.ru и подобные им не подходят. Из бесплатных хостингов тут необходимо использовать такие хостинги, как holm.ru, fatal.ru, wallst.ru, aha.ru и подобные им.

Скорее всего в качестве панели управления у вас будет cPanel, IPS Manager, DirectAdmin или любая аналогичная. В любой из этих панелей управления среди прочего есть такая полезная функция, как «Защита директории» (как вариант, она еще может называться «Защита папки» или еще как-нибудь в этом духе). С ее помощью очень просто создать серверную защиту для любого каталога вашего сайта. Для этого необходимо лишь указать имя нужного каталога, логин и пароль, который вы хотите использовать для доступа к этому каталогу, а все остальное веб-сервер сделает автоматически. Можете пользоваться!

Кстати, при помощи этой же панели управления аккаунтом можно настроить доступ к одной папке для нескольких пользователей, для каждого со своим логином и паролем. Это может пригодиться в том случае, если над сайтом работает не один человек и доступ к защищенному каталогу должны иметь сразу несколько человек.

Если же вам интересно, как именно работает этот механизм серверной авторизации, то расскажу подробнее, как это происходит. В корне каталога, доступ к которому можно закрыть при помощи серверной защиты, необходимо создать файл с именем .htaccess (именно так, без расширения и с точкой впереди). Вообще, это уникальный файл. С его помощью можно создавать огромное количество настроек для веб-сервера.

Но в данном случае я расскажу лишь, как с его помощью можно создать серверную защиту для каталога. В .htaccess нужно записать следующую информацию:

1
2
3
4
5
DirectoryIndex index.php
AuthUserFile /home/<ИМЯ-АККАУНТА>/<ПУТЬ-ДО-НУЖНОЙ-ПАПКИ>/.htpass
AuthName "Панель администрирования новостей"
AuthType Basic
require valid-user

Строка «DirectoryIndex index.php» определяет, что если человек наберет адрес как www.site.com/ИМЯ-КАТАЛОГА/, то ему будет показан не перечень файлов этого каталога, а заглавная страница этого каталога, то есть в данном случае index.php В случае с модулем администрирования новостей вы можете написать так: «DirectoryIndex news-admin.php»

Строка «AuthUserFile …» определяет полный путь до файла, в котором хранятся логин и пароль для доступа к папке. Эта строка может выглядеть так: AuthUserFile /home/barkov.net/public_html/admin/.htpass Обратите внимание, что указывается именно полный, а не относительный адрес до файла с логином и паролем. То есть в данном случае логин и пароль хранятся в той же папке /admin/, что и файл .htaccess.

Строка AuthName определяет текст, выводимый в окне для ввода логина и пароля, которое выдается браузером при входе в защищенный каталог.

Теперь создайте файл с именем .htpass (как и .htaccess, с точкой впереди и без расширения). В файле .htpass хранится информация в следующем формате:

1
<login>:<password>

Например,

1
admin:6qTIFolZGvK/g

В данном случае пароль простой – kolobok, просто так он выглядит после обработки пароля утилитой htpasswd. А зашифровать пароль надо, иначе серверная аутентификация работать не будет. Подробно о работе с утилитой можно прочесть на различных интернет-ресурсах, посвященных веб-программированию либо в книге, о которой я рассказывал в начале статьи, «Разработка web-приложений на PHP и MySQL». Это достаточно объемная и интересная тема.

В любом случае, имеет смысл воспользоваться предлагаемой панелью управления настройкой серверной защиты каталога. Работая с панелью управления, практически невозможно ошибиться, чего к сожалению достаточно трудно избежать при ручной настройке .htaccess и .htpass.

Вот в основном и все. Описанный в статье модуль новостей можно расширять и дополнять, но свои основные функции он выполняет и сейчас.