Поиск

Использование HTTP-заголовков

Заголовок HTTP (протокола передачи гипертекста) используется для переда чи информации между сервером и клиентом (Webбраузером). Обычно эта информация существует в форме HTML, вот почему адреса Webстраниц начи наются с записи http://.

HTTPзаголовки это достаточно сложная тема, которая заслуживает от дельного рассмотрения. HTTPзаголовки могут использоваться в разных целях. В языке РНР доступ к деталям протокола HTTP выполняется через специаль ную функцию header ( ) . Одна из задач, выполняемых с помощью этой функ ции, переадресация пользователя с одной страницы на другую. (Дополни тельную информацию по этому вопросу вы можете получить по адресу http:// www.w3.org/ProtocoIs/rfc2616/rfc2616.)

Для переадресации пользователя применяется следующий код:

Функцию заголовка разрешается использовать и для отправки cookieфай лов в целях дублирования функции setcookie ( ) , которая иногда выдает раз ные результаты в разных браузерах:

header("Setcookie:name=value;expires=expiration");

Используя функцию header ().., необходимо понимать следующее: она долж на быть вызвана до того, как чтолибо было отправлено в Webбраузер, так же как и в случае с функцией setcookie ( ) .

Чтобы показать переадресацию, создадим простой сценарий, который бу дет направлять пользователя при аутентификации на одну страницу, если были введены правильные имя и пароль, и на другую в противном случае.
Использование функции header

  1. Создайте новый PHPдокумент в текстовом редакторе:
  2. <?php
  3. Присвойте странице название и включите файл заголовка.
  4. $PageTitle= "Login Page";
    require ("header.php");
  5. Создайте условную инструкцию, которая напечатает сообщение, если при аутентификации пользователь допустил ошибки.
  6. if ($Message == "Invalid") {
    print ("<BxCENTERxFONT COLOR=RED>The username and password
    —you entered do not match what is on file. Please try again!</FONT>
    </CENTERx/B>\n") ;

    Если переданные имя и пароль не соответствуют хранящимся в файле, пользователь будет отправлен обратно к этой странице со значением перемен ной $Message, равным Invalid. Появится сообщение об ошибке.

  7. Создайте HTMLформу для ввода имени пользователя и пароля.
  8. print ("<FORM ACTION=\"HandleLogin.php\" METHOD=POST>\n");
    print ("Username: <INPUT TYPE=TEXT NAME=UserNamexBR>\n");
    print ("Password: <INPUT TYPE=PASSWORD NAME=PasswordxBR>\n");
    print ("<INPUT TYPE=SUBMIT NAME=SUBMIT VALUE=\"Submit!\">\n");
  9. Включите файл нижнего колонтитула и закройте РНРстраницу.
  10. require ("footer.php");
  11. Сохраните сценарий как login.php (листинг 13.6) и загрузите его на сервер. Листинг 13.6 т Печатать сообщения об ошибке вполне разумно, так как вы наверняка захотите дать пользователю еще одну попытку, если подлинность его имени и пароля не установлена.
  12. 1 <?php '
    2 $PageTitle = "Login Page";
    3 require ("header.php");
    4 if ($Message == "Invalid") {
    5 print ("<BxCENTERxFONT COLOR=RED>The username and password you
    entered do not match what is on file. Please try again!</FONT>
    </CENTERx/B>\n");
    6 }
    7 print ("<FORM ACTION=\"HandleLogin.php\" METHOD=POST>Vn");
    8 print ("Username: <INPUT TYPE=TEXT NAME=UserNamexBR>\n");
    9 print ("Password: <INPUT TYPE=PASSWORD NAME=PasswordxBR>\n");
    10 print ("<INPUT TYPE=SUBMIT NAME=SUBMIT VALUE=\"Submit!\">\n");
    11 require ("footer.php");
    12 ?>

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

  13. Создайте новый PHPдокумент в текстовом редакторе:
  14. <?php
  15. Создайте условную конструкцию, которая будет проверять соответствие значений переменных $UserName и $Password.
  16. if (($UserName == "Larry") && ($Paseword == "LarryPass")) {

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

  17. Если введенные данные правильны, направим пользователя на главную страницу.
  18. header ("Location: index.php?UserName=$UserName");
    exit;

    Это выражение переправит пользователя на ресурс index.php. Туда также будет отправлено значение имени пользователя. Инструкция exit; «говорит» РНР прекратить выполнение кода этой стра ницы, так как пользователь уже отправлен на другую.

  19. Закончим условную конструкцию и направим пользователя обратно на страницу .аутентификации в случае неверного пароля.
  20. } else {
    header ("Location: login.php?Message=Invalid");
    exit;
    }

    Если переданные значения не соответствуют хранящимся в файле, пользо вателю будет предоставлена еще одна возможность зарегистрироваться. Он будет отправлен на страницу login.php. Код ?Message=Invalid, добавленный к URL, заставит сценарий login.php напечатать сообщение об ошибке (см. так же листинг 13.6).

  21. Закройте РНРстраницу.
  22. ?>
  23. Сохраните сценарий как HandleLogin.php (листинг 13.7) и загрузите его на сервер.
  24. Листинг 13.7 т Этот сценарий будет проверять подлинность имени пользо вателя и пароля с помощью заранее определенных значений и перенаправлять пользователя соответствующим образом. Вне тэга РНР в этом сценарии не долж но быть лишних пробелов, иначе функция header ( ) выдаст ошибку.

    1 <?php
    2 if (($UserName == "Larry") && ($Password == "LarryPaes")) {
    3 header ("Location: index.php?UserName=$UserName");
    4 exit;
    5 } else {
    6 header ("Location: login.php?Message=Invalid");
    7 exit;
    8 }
    9 ?>

    Модифицируем исходную страницу index.php, чтобы на экране появлялось приветственное сообщение,

  25. Откройте файл index.php в текстовом редакторе (листинг 13.3).
  26. Замените строку 4 на следующую:
  27. print ("Greetings,$UserName!\n");
  28. Сохраните сценарий как index.php (листинг 13.8), загрузите его на сер вер и протестируйте все страницы начиная с login.php в Webбраузере (рис. 13.813.10). Листинг 13.8 т Мы добавили персонифицированное приветствие, что сде лало страницу более динамичной. Значение переменной $UserName передает ся из функции header ( ) (листинг 13.7).
1 <?php
2 $PageTitle = "Home Page";
3 require ("header.php");
4 print ("Greetings, $OserName!\n");
5 print <"<P>Click <A HREF=\"page2.php\">
here</A> to go to the next page.\n");
6 require ("footer.php");
7?>