$_SERVER - Информация о сервере и среде исполнения. Суперглобальный массив $_SERVER в PHP ($HTTP_SERVER_VARS) Безгрешный server php

Суперглобальный массив $_SERVER

Одним из важнейших предопределённых массивов является массив $_SERVER - в него PHP-интерпретатор помещает переменные, полученные от сервера. Без данных переменных сложно организовать полноценную поддержку Web-приложений. Ниже приводится описание наиболее важных элементов суперглобального массива $_SERVER.

Замечание

Просмотреть полный список элементов массива $_SERVER можно либо при помощи функции print_r(), которая распечатывает дамп массива либо при помощи функции phpinfo(), которая выводит информацию о PHP-интерпретаторе.

Элемент $_SERVER["DOCUMENT_ROOT"]

Элемент $_SERVER["DOCUMENT_ROOT"] содержит путь к корневой директории сервера, если скрипт выполняется в виртуальном хосте, в данном элементе указывается путь к корневой директории виртуального хоста. Т.е. в конфигурационном файле httpd.conf виртуальный хост имеет директиву DocumentRoot, которой присвоено значение "D:/main", элемент $_SERVER["DOCUMENT_ROOT"] будет содержать значение "D:main".

Элемент $_SERVER["HTTP_ACCEPT"]

В элементе $_SERVER["HTTP_ACCEPT"] описываются предпочтения клиента относительно типа документа. Содержимое этого элемента извлекается из HTTP-заголовка Accept, который присылает клиент серверу. Содержимое данного заголовка может выглядеть следующим образом

image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/msword, */*

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

Символ * используется для группирования типов в медиа-ряду. К примеру, символом */* задается использование всех типов, а обозначение type/* определяет использование всех подтипов выбранного типа type.

Замечание

Медиа-типы отделяются друг от друга запятыми.

Каждый медиа-ряд характеризуется также дополнительным набором параметров. Одним из них является так называемый относительный коэффициент предпочтения q, который принимает значения от 0 до 1, соответственно, от менее предпочитаемых типов к более предпочитаемым. Использование нескольких параметров q, позволяет клиенту сообщить серверу относительную степень предпочтения для того или иного медиа-типа.

Замечание

По умолчанию параметр q принимает значение 1. Кроме того, от медиа-типа он отделяется точкой с запятой.

Пример заголовка типа Accept:

Accept: audio/*; q=0.2, audio/basic

В данном заголовке первым идёт тип audio/* включающий в себя все музыкальные документы и характеризующийся коэффициентом предпочтения 0.2. Через запятую указан тип audio/basic, для которого коэффициент предпочтения не указан и принимает значение по умолчанию равное единице. Цитируя RFС2616 данный заголовок можно интерпретировать следующим образом: “Я предпочитаю тип audio/basic, но мне можно также слать документы любого другого audio-типа, если они будут доступны, после снижения коэффициента предпочтения более чем на 80 %”.

Пример может быть более сложным.

Accept: text/plain; q=0.5, text/html,
text/x-dvi; q=0.8, text/x-c

Замечание

Следует учитывать, что элемент $_SERVER["HTTP_ACCEPT"] содержит точно такую же информацию, но без начального заголовка Accept.

Этот заголовок интерпретируется следующим образом: Типы документов text/html и text/x-c являются предпочтительными, но если они недоступны, тогда клиент отсылающий данный запрос, предпочтёт text/x-dvi, а, если и его нет, то он может принять тип text/plain.

Элемент $_SERVER["HTTP_ACCEPT_LANGUAGE"]

В элементе $_SERVER["HTTP_ACCEPT_LANGUAGE"] описываются предпочтения клиента относительно языка. Данная информация извлекается из HTTP-заголовка Accept-Language, который присылает клиент серверу. Можно привести следующий пример:

Accept-Language: ru, en; q=0.7

Который можно интерпретировать следующим образом: клиент предпочитает русский язык, но в случае его отсутствия согласен принимать документы на английском. Элемент $_SERVER["HTTP_ACCEPT_LANGUAGE"] будет содержать точно такую же информацию, но без заголовка Accept-Language:

ru, en; q=0.7

Содержимое элемента $_SERVER["HTTP_ACCEPT_LANGUAGE"] можно использовать для определения национальной принадлежность посетителей. Однако результаты будут приблизительными, так как многие пользователи используют английские варианты браузеров, которые будут извещать сервер о том, что посетитель предпочитает лишь один язык - английский.

Элемент $_SERVER["HTTP_HOST"]

В элементе $_SERVER["HTTP_HOST"] содержится имя сервера, которое, как правило, совпадает с доменным именем сайта, расположенного на сервере. Как правило, имя, указанное в данном параметре совпадает с именем $_SERVER["SERVER_NAME"]. В параметре приводится лишь доменное имя без названия протокола (http://), т.е.

www.sofftime.ru

Элемент $_SERVER["HTTP_REFERER"]

В элементе $_SERVER["HTTP_REFERER"] приводится адрес страницы, с которой посетитель пришёл на данную страницу. Переход должен осуществляться по ссылке. Создадим две страницы index.php и page.php.

Страница index.php

echo "Ссылка на страницу PHP
"
;
echo .
$_SERVER [ "HTTP_REFERER" ]
?>

Страница page.php будет аналогичного содержания, но ссылка будет указывать на страницу index.php.

Страница page.php

echo "Ссылка на страницу PHP
"
;
echo "Содержимое $_SERVER["HTTP_REFERER"] - " .
$_SERVER [ "HTTP_REFERER" ]
?>

При переходе с одной страницы на другую, под ссылкой будет выводится адрес страницы, с которой был осуществлён переход.

Элемент $_SERVER["HTTP_USER_AGENT"]

Элемент $_SERVER["HTTP_USER_AGENT"] содержит информацию о типе и версии браузера и операционной системы посетителя.

Вот типичное содержание этой строки: "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)". Наличие подстроки "MSIE 6.0" говорит о том, что посетитель просматривает страницу при помощи Internet Explorer версии 6.0. Строка "Windows NT 5.1" сообщает, что в качестве операционной системы используется Windows XP.

Замечание

Для Windows 2000 элемент $_SERVER["HTTP_USER_AGENT"] выглядит следующим образом: "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)")", в то время как для Windows XP - "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)".

Если посетитель воспользуется браузером Opera, то содержание $_SERVER["HTTP_USER_AGENT"]может выглядеть следующим образом: "Mozilla/4.0 (compatible; MSIE 5.0; Windows 98) Opera 6.04 ". Подстрока "MSIE 6.0" здесь так же присутствует, сообщая, что браузер Opera является совместимым с браузером Internet Explorer и использует те же динамические библиотеки Windows. Поэтому, при анализе строки, возвращаемой браузером, следует иметь в виду, что к Internet Explorer относится строка, содержащая подстроку "MSIE 6.0" и не содержащая подстроки "Opera". Кроме того, из данной строки можно заключить, что пользователь использует операционную систему Windows 98.

Замечание

Пользовательский агент браузера Firefox может выглядеть следующим образом Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8) Gecko/20051111 Firefox/1.5.

При использовании браузера Netscape, содержание элемент $_SERVER["HTTP_USER_AGENT"] может выглядеть следующим образом: "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.4) Gecko/20030624 Netscape/7.1". Принадлежность к этому браузеру можно определить по наличию подстроки "Netscape". Кроме того, можно узнать, что посетитель выходит в Интернет, используя операционную версию Linux, с ядром, оптимизированным под Pentium IV, находясь в графической оболочке X-Window. Этот механизм удобно использовать для сбора статистической информации, которая позволяет дизайнерам оптимизировать страницы под наиболее распространенные браузеры.

Элемент $_SERVER["REMOTE_ADDR"]

В элемент $_SERVER["REMOTE_ADDR"] помещается IP-адрес клиента. При тестировании на локальной машине - этот адрес будет равен 127.0.0.1. Однако при тестировании в сети переменная вернёт IP-адрес клиента или последнего прокси-сервера через который клиент попал на сервер. Если клиент использует прокси-сервер узнать его IP-адрес можно при помощи переменной окружения HTTP_X_FORWARDED_FOR, значение которой можно получить при помощи функции getenv().

Замечание

Прокси-сервера являются специальными промежуточными серверами, предоставляющими специальный вид услуг: сжатие трафика, кодирование данных, адаптация под мобильные устройства и т.п. Среди множества прокси-серверов различают так называемые анонимные прокси-сервера, которые позволяют скрывать истинный IP-адрес клиента, такие сервера не возвращают переменной окружения HTTP_X_FORWARDED_FOR.

Извлечение переменной окружения HTTP_X_FORWARDED_FOR

echo getenv (HTTP_X_FORWARDED_FOR );
?>

Элемент $_SERVER["SCRIPT_FILENAME"]

В элемент $_SERVER["SCRIPT_FILENAME"] помещается абсолютный путь к файлу от корня диска. Так, если сервер работает под управлением операционной системы Windows, то такой путь может выглядеть следующим образом "d:main estindex.php", т.е. путь указывается от диска, в UNIX-подобной операционной системы путь указывается от корневой директории /, например "/var/share/www/test/index.php".

Элемент $_SERVER["SERVER_NAME"]

В элемент $_SERVER["SERVER_NAME"] помещается имя сервера, как правило, совпадающее с доменным именем сайта, расположенного на нём. Например,

www.softtime.ru

Содержимое элемента $_SERVER["SERVER_NAME"] часто совпадает с содержимым элемента $_SERVER["HTTP_HOST"]. Помимо имени сервера суперглобальный массив $_SERVER позволяет выяснить ещё ряд параметров сервера, например IP-адрес сервера, прослушиваемый порт, какой Web-сервер установлен и версию HTTP протокола. Эта информация помещается в элементы $_SERVER["SERVER_ADDR"], $_SERVER["SERVER_PORT"], $_SERVER["SERVER_SOFTWARE"] и $_SERVER["SERVER_PROTOCOL"], соответственно. Ниже приводится пример с использованием данных элементов.

Использование элементов массива $_SERVER

echo "Имя сервера - " . $_SERVER [ "SERVER_NAME" ]. "
" ;
echo "IP-адрес сервера - " . $_SERVER [ "SERVER_ADDR" ]. "
" ;
echo "Порт сервера - " . $_SERVER [ "SERVER_PORT" ]. "
" ;
echo "Web-сервер - " . $_SERVER [ "SERVER_SOFTWARE" ]. "
" ;
echo "Версия HTTP-протокола - " . $_SERVER [ "SERVER_PROTOCOL" ]. "
" ;
?>

Элемент $_SERVER["REQUEST_METHOD"]

В элемент $_SERVER["REQUEST_METHOD"] помещается метод запроса, который применяется для вызова скрипта: GET или POST.

У Вас в браузере заблокирован JavaScript. Разрешите JavaScript для работы сайта!

Суперглобальный массив $_SERVER

В массив $_SERVER PHP-интерпретатор помещает переменные, полученные от сервера. Без данных переменных сложно организовать полноценную поддержку Web-приложений. Ниже приводится описание наиболее важных элементов суперглобального массива $_SERVER .

Замечание

  • Просмотреть полный список элементов массива $_SERVER
  • можно либо при помощи функции print_r(), которая распечатывает дамп массива либо при помощи функции phpinfo(), которая выводит информацию о PHP-интерпретаторе.

    Array ( => on => 200 => on => htmlweb.ru => https => 443 => close => Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html) => */* => beget=begetok; => gzip,deflate => /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin => => Apache/2.4.25 (Debian) mpm-itk/2.4.7-04 OpenSSL/1.0.2l => htmlweb.ru => 185.12.92.137 => 80 => 144.76.78.4 => /var/www/htmlweb/data/www/htmlweb.ru => http => => /var/www/htmlweb/data/www/htmlweb.ru => [email protected] =>.php => 35242 => /php/function/$_server.php => CGI/1.1 => HTTP/1.0 => GET => => /php/function/%24_server.php => /index.php => /index.php => 1560059525.711 => 1560059525) 1

    $_SERVER["DOCUMENT_ROOT "]

    Элемент $_SERVER["DOCUMENT_ROOT"] содержит путь к корневой директории сервера, если скрипт выполняется в виртуальном хосте, в данном элементе указывается путь к корневой директории виртуального хоста. Т.е. в конфигурационном файле httpd.conf виртуальный хост имеет директиву DocumentRoot, которой присвоено значение "D:/main", элемент $_SERVER["DOCUMENT_ROOT"] будет содержать значение "D:main".

    $_SERVER["REMOTE_ADDR "]

    В элемент $_SERVER["REMOTE_ADDR"] помещается IP-адрес клиента. При тестировании на локальной машине - этот адрес будет равен 127.0.0.1. Однако при тестировании в сети переменная вернёт IP-адрес клиента или последнего прокси-сервера через который клиент попал на сервер. Если клиент использует прокси-сервер узнать его IP-адрес можно при помощи переменной окружения HTTP_X_FORWARDED_FOR, значение которой можно получить при помощи функции getenv().

    Замечание

    Прокси-сервера являются специальными промежуточными серверами, предоставляющими специальный вид услуг: сжатие трафика, кодирование данных, адаптация под мобильные устройства и т.п. Среди множества прокси-серверов различают так называемые анонимные прокси-сервера, которые позволяют скрывать истинный IP-адрес клиента, такие сервера не возвращают переменной окружения HTTP_X_FORWARDED_FOR.

    Извлечение переменной окружения HTTP_X_FORWARDED_FOR

    echo @getenv(HTTP_X_FORWARDED_FOR);

    $_SERVER["SCRIPT_FILENAME "]

    В элемент $_SERVER["SCRIPT_FILENAME"] помещается абсолютный путь к файлу от корня диска. Так, если сервер работает под управлением операционной системы Windows, то такой путь может выглядеть следующим образом "d:main estindex.php", т.е. путь указывается от диска, в UNIX-подобной операционной системы путь указывается от корневой директории /, например "/var/share/www/test/index.php".

    /var/www/htmlweb/data/www/сайт/index.php

    $_SERVER["SERVER_NAME "]

    В элемент $_SERVER["SERVER_NAME"] помещается имя сервера, как правило, совпадающее с доменным именем сайта, расположенного на нём. Например,

    Содержимое элемента $_SERVER["SERVER_NAME"] часто совпадает с содержимым элемента $_SERVER["HTTP_HOST"]. Помимо имени сервера суперглобальный массив $_SERVER позволяет выяснить ещё ряд параметров сервера, например IP-адрес сервера, прослушиваемый порт, какой Web-сервер установлен и версию HTTP протокола. Эта информация помещается в элементы $_SERVER["SERVER_ADDR"], $_SERVER["SERVER_PORT"], $_SERVER["SERVER_SOFTWARE"] и $_SERVER["SERVER_PROTOCOL"], соответственно. Ниже приводится пример с использованием данных элементов.

    Использование элементов массива $_SERVER

    echo "Имя сервера - ".$_SERVER["SERVER_NAME"]."
    "; echo "IP-адрес сервера - ".$_SERVER["SERVER_ADDR"]."
    "; echo "Порт сервера - ".$_SERVER["SERVER_PORT"]."
    "; echo "Web-сервер - ".$_SERVER["SERVER_SOFTWARE"]."
    "; echo "Версия HTTP-протокола - ".$_SERVER["SERVER_PROTOCOL"]."
    ";

    Имя сервера - сайт
    IP-адрес сервера - 185.12.92.137
    Порт сервера - 80
    Web-сервер - Apache/2.4.25 (Debian) mpm-itk/2.4.7-04 OpenSSL/1.0.2l
    Версия HTTP-протокола - HTTP/1.0

    $_SERVER["REQUEST_METHOD "]

    В элемент $_SERVER["REQUEST_METHOD"] помещается метод запроса, который применяется для вызова скрипта: GET или POST.

    Echo $_SERVER["REQUEST_METHOD"];

    $_SERVER["QUERY_STRING "]

    В элемент $_SERVER["QUERY_STRING"] заносятся параметры, переданные скрипту, если строка запроса представляет собой адрес

    Например при обращении к:
    в элемент $_SERVER["QUERY_STRING"] попадёт весь текст после знака "?":

    Echo $_SERVER["QUERY_STRING"];

    id=1&test=wet&id_theme=512

    $_SERVER["PHP_SELF "]

    В элемент $_SERVER["PHP_SELF"] помещается имя скрипта, начиная от корневой директории виртуального хоста, т.е. если строка запроса представляет собой адрес http://www.mysite.ru/test/index.php?id=1&test=wet&id_theme=512 то элемент $_SERVER["PHP_SELF"] будет содержать фрагмент "/test/index.php" . Как правило, этот же фрагмент помещается в элемент $_SERVER["SCRIPT_NAME"].

    $_SERVER["REQUEST_URI "]

    В элемент $_SERVER["REQUEST_URI"] содержит имя скрипта, начиная от корневой директории виртуального хоста и параметры, т.е. если строка запроса представляет собой адрес: http://www.mysite.ru/test/index.php?id=1&test=wet&id_theme=512 то элемент $_SERVER["REQUEST_URI"] будет содержать фрагмент "/test/index.php?id=1&test=wet&id_theme=512" . Для того, чтобы восстановить в скрипте полный адрес, который помещён в строке запроса, достаточно использовать комбинацию элементов массива $_SERVER, представленную ниже

    Полный адрес к скрипту

    echo "http://".$_SERVER["SERVER_NAME"].$_SERVER["REQUEST_URI"];

    И именно это клиент фактически использовал как "целевой хост" запроса. SERVER_NAME определяется в конфигурации сервера. Какой из них зависит от того, для чего вам это нужно. Теперь вы должны понимать, что это контролируемое клиентом значение, которое, таким образом, не может быть надежным для использования в бизнес-логике, а другое является контролируемым сервером значением, которое является более надежным. Тем не менее вам необходимо убедиться, что веб-сервер имеет правильную конфигурацию SERVER_NAME . Взяв Apache HTTPD в качестве примера, здесь выдержка из ее документации :

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

    Обновить : после проверки ответа Pekka на ваш вопрос , который содержит ссылку на bobince answer , что PHP всегда будет возвращать значение HTTP_HOST для SERVER_NAME , что противоречит моему собственному опыту PHP 4.x + Apache HTTPD 1.2.x с пару лет назад, я взорвал пыль от моего текущего XAMPP в Windows XP (Apache HTTPD 2.2.1 с PHP 5.2.8), запустил его, создал страницу PHP, которая печатает оба значения, создала тестовое приложение Java, используя URLConnection , чтобы изменить заголовок Host , и тесты научили меня, что это действительно (неверно) случай.

    После первого подозрения PHP и копания в некоторых отчетах об ошибках PHP в отношении предмета, я узнал, что корень проблемы находится на используемом веб-сервере, что он неправильно возвратил заголовок HTTP Host , когда была запрошена SERVER_NAME . Таким образом, я перекопал в отчеты об ошибках Apache HTTPD , используя различные ключевые слова относительно субъект, и я наконец нашел связанную ошибку . Это поведение было введено, так как вокруг Apache HTTPD 1.3. Вам нужно установить UseCanonicalName директиву on в записи ServerName в httpd.conf (также проверьте предупреждение внизу документ !).

    ServerName example.com UseCanonicalName on

    Это сработало для меня.

    Обобщенный, SERVER_NAME более надежный, но вы зависимый в конфигурации сервера!

    HTTP_HOST - целевой хост, отправленный клиентом. Пользователь может свободно манипулировать пользователем. Не нужно посылать запрос на ваш сайт с запросом HTTP_HOST значения www.stackoverflow.com .

    SERVER_NAME исходит из определения сервера VirtualHost и поэтому считается более надежным. Его также можно манипулировать извне при определенных условиях, связанных с настройкой вашего веб-сервера. См. Этот Этот вопрос SO , который касается аспектов безопасности обоих вариантов.

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

    Обратите внимание, что если вы хотите использовать IPv6, вы, вероятно, захотите использовать HTTP_HOST , а не SERVER_NAME . Если вы введете http://[::1]/ , переменные среды будут следующими:

    HTTP_HOST = [::1] SERVER_NAME = ::1

    Это означает, что если вы делаете mod_rewrite, например, вы можете получить неприятный результат. Пример перенаправления SSL:

    # SERVER_NAME will NOT work - Redirection to https://::1/ RewriteRule .* https://%{SERVER_NAME}/ # HTTP_HOST will work - Redirection to https://[::1]/ RewriteRule .* https://%{HTTP_HOST}/

    Это относится ТОЛЬКО, если вы обращаетесь к серверу без имени хоста.

    если вы хотите проверить через server.php или что вы хотите вызвать со следующим:

    Затем получите доступ ко всем действительным URL-адресам для вашего сайта и проверьте разницу.

    Мне потребовалось некоторое время, чтобы понять, что люди подразумевают под " SERVER_NAME более надежным". Я использую общий сервер и не имею доступа к директивам виртуального хоста. Итак, я использую mod_rewrite в.htaccess для сопоставления различных HTTP_HOST в разных каталогах. В этом случае это значение HTTP_HOST имеет смысл.

    Ситуация аналогична, если вы используете виртуальные хосты на основе имен: директива ServerName внутри виртуального хоста просто говорит, какое имя хоста будет сопоставлено этому виртуальному хосту. Суть в том, что в обоих случаях имя хоста, предоставленное клиентом во время запроса (HTTP_HOST), должно совпадать с именем на сервере, которое само отображается в каталог. Независимо от того, выполняется ли сопоставление с директивами виртуального хоста или с правилами htaccess mod_rewrite, здесь вторично. В этих случаях HTTP_HOST будет таким же, как SERVER_NAME . Я рад, что Apache настроен таким образом.

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

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

    Предполагая, что у вас есть простая настройка (CentOS 7, Apache 2.4.x и PHP 5.6.20) и только один веб-сайт (не предполагающий виртуальный хостинг)...

    В смысле PHP $_SERVER["SERVER_NAME"] - это элемент PHP, зарегистрированный в суперкласме $_SERVER на основе вашей конфигурации Apache (директива **ServerName** с UseCanonicalName On) в httpd.conf(будь то из включенной конфигурации виртуального хоста файл, что угодно и т.д.). HTTP_HOST выводится из заголовка HTTP host . Рассматривайте это как пользовательский ввод. Фильтр и проверка перед использованием.

    Вот пример того, где я использую $_SERVER["SERVER_NAME"] в качестве основы для сравнения. Следующий метод относится к конкретному дочернему классу, который я назвал ServerValidator (дочерний элемент Validator). ServerValidator проверяет шесть или семь элементов в $_SERVER перед их использованием.

    При определении того, является ли HTTP-запрос POST, я использую этот метод.

    Public function isPOST() { return (($this->requestMethod === "POST") && // Ignore $this->hasTokenTimeLeft() && // Ignore $this->hasSameGETandPOSTIdentities() && // Ingore ($this->httpHost === filter_input(INPUT_SERVER, "SERVER_NAME"))); }

    К моменту вызова этого метода будет выполняться вся фильтрация и проверка соответствующих элементов $_SERVER (и соответствующих наборов свойств).

    ($this->httpHost === filter_input(INPUT_SERVER, "SERVER_NAME")

    Проверяет, что значение $_SERVER["HTTP_HOST"] (в конечном счете полученное из запрошенного HTTP-заголовка host) соответствует $_SERVER["SERVER_NAME"] .

    Теперь я использую суперглобальный разговор, чтобы объяснить мой пример, но это потому, что некоторые люди не знакомы с INPUT_GET , INPUT_POST и INPUT_SERVER в отношении filter_input_array() .

    Суть в том, что я не обрабатываю запросы POST на моем сервере, если не выполнены все четыре условия. Следовательно, с точки зрения запросов POST отказ в предоставлении HTTP host заголовка (присутствия, проверенного для более ранних) заклинаний doom для строгих браузеров HTTP 1.0 . Кроме того, запрашиваемый хост должен соответствовать значению ServerName в httpd.conf, а по расширению - значению $_SERVER("SERVER_NAME") в супермаклоне $_SERVER . Опять же, я бы использовал INPUT_SERVER с функциями фильтра PHP, но вы ломали мой дрейф.

    Как указано в balusC, SERVER_NAME не является надежным и может быть изменен в конфигурации apache, конфигурации сервера сервера и брандмауэра, которые могут находиться между вами и сервером.

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

    Function getRealHost(){ list($realHost,)=explode(":",$_SERVER["HTTP_HOST"]); return $realHost; }

    поделиться
    • Перевод
    • Tutorial

    Одним из крутейший новшеств в php 5.4 является встроенный сервер, созданный специально для разработки и тестирования. Теперь вы можете писать и тестировать свой код не имея полноценного веб-сервера - просто запустите встроенный сервер, протестируйте свой код, и выключите его, когда закончите.
    Сервер, так же, предоставляет возможность и для творческого использования. Например, вы можете распространять портативное web-приложение на CD или USB, или даже как десктопное приложение, созданное на PHP без использования GTK или других графических библиотек.

    В мануале PHP подчеркивается, что встроенный сервер предназначен для разработки и рекомендуется не использовать его на боевом сервере. Отсутствуют какие-либо INI директивы отвечающие за сервер (за исключением раскрашивания вывода в консоли), и, кажется, что основная идея документации: «у нас теперь тоже есть Web сервер, отстаньте от нас».
    Несмотря на это, я считаю, что встроенные сервер может быть ценным инструментом для разработки и тестирования. К примеру, на моей машине я использую предустановленный Apache с кастомной конфигурацией, подходящей для меня, но иногда я хочу попробовать какие-либо новые Web-приложения. Со встроенным web-сервером я могу протестировать приложение прямо из папки «downloads» или временной папки и переместить в обычную среду, только тогда, когда это будет необходимо.
    Но для начала, это не так просто, ведь многие написанные приложения используют.htaccess и mod_rewrite. Но я уверен, что кто-то (может быть один из вас, почему бы и нет?) напишет адаптер для этого, и я хотел бы быть первым, кто протестируют его.
    В этой статье я объясню некоторые основные примеры использования встроенного сервера и покажу вам как сделать его полезным для разработки и тестирования.

    Используем встроенный сервер

    Итак, для использования сервера нам необходим php 5.4 или выше. Для проверки версии PHP, выполните:
    php -v
    Так же вы можете определить доступен ли сервер в вашей сборке выполнив:
    php -h
    и найдите там описание параметров "-S" и "-t", которые используются только для сервера.
    Для проверки сервера вы можете создать в текущей директории файл index.php, который будет содержать в себе вызов функции phpinfo() и затем запустить сервер:
    $ php -S 127.0.0.1:8080 PHP 5.4.0RC7 Development Server started at Fri Feb 26 18:49:29 2012 Listening on 127.0.0.1:8080 Document root is /home/ec2-user Press Ctrl-C to quit.
    И теперь вы можете увидеть содержимое отданной встроенным web-сервером:

    В консоль же будет писаться каждый запрос клиента:
    80.180.55.37:36318 : / 80.180.55.37:36584 : /
    Возвращаясь назад, разберем параметр командной строки "-S", который используется для указания адреса, с которого сервер будет доступен. Возможные значения:
    localhost - сервер будет доступен только с локальной машины,
    0.0.0.0 - на любому интерфейсе машины,
    Любой внешний или серый IP - только на указанном IP
    Параметр "-t" устанавливает указанную директорию «directory root». Например:
    $ php -S :8090 -t /home/ec2-user/public
    Кроме того,. вы может указать имя конкретного файла-роутера. Например:
    $ php -S >localhost or your public IP>:8080 -t /home/ec2-user/public public/index.php
    Вывод этого роутера будет парситься и выполняться сервером. Простой пример:
    Welcome to PHP

    ";
    Если скрипт вернет FALSE, тогда запрашиваемый URI будет обрабатываться сервером, который будет выдавать запрошенный ресурс, либо вернет 404 ошибку. Если скрипт возвращает что-либо ещё, вывод скрипта передастся клиенту.
    Хотя данный подход даёт нам больше контроля, есть несколько вещей, которые вы должны знать. Во-первых, PHP сервер отдаёт только минимальный набор HTTP заголовков:
    Connection: closed Content-Type: text/html Host: aws-dev-01.vtardia.com X-Powered-By: PHP/5.4.0RC7 D
    Сравним это с заголовками, возвращаемыми сервером Apache:
    Accept-Ranges: bytes Connection: Keep-Alive Content-Length: 631 Content-Type: text/html Date: Sat, 04 Feb 2012 18:24:42 GMT Etag: "bbb99-277-4ace8c5470a40" Keep-Alive: timeout=15, max=100 Last-Modified: Wed, 14 Sep 2011 15:54:09 GMT Server: Apache/2.2.21 (Unix) DAV/2
    Если ваше приложение использует заголовки, то оно должно учитывать разницу в development-среде и в production.
    Во-вторых, встроенный сервер имеет другое SAPI (Server API). Таким образом выполняя маршрутизацию в index,php вы можете определить на тестовом или боевом сервер происходит обращение к скрипту. php_sapi_name() вернет «cli-server» на встроенном сервере:
    Существует одна специальная INI директива - «cli_server.color». Данная директива возвращает раскрашенный вывод в консоли. Создайте пустой файл с именем cli-server.ini и вставьте эту строку:
    cli_server.color = on
    Вы можете создать уникальную конфигурацию окружения для вашего сервера, указав в вашем INI файле необходимые директивы. Не объявленные директивы примут значения по-умолчанию. Сейчас мы объявили только одну директиву - cli_server.color .
    Запустить сервер с параметром "-c" с указанием INI файла:
    $ php -S localhost -c cli-server.ini
    Если ваш терминал поддерживает цвета, то вы сможете увидеть «цветной» вывод в консоли. 200 статус будет выделен зеленым, 404 - оранжевым, а ошибки сценария будут выделены красным цветом.

    Создаём персональный сервер

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

    Папка «library» содержит код приложения, «public» - корневая директория, содержит index.php и несколько статичных файлов. Особое внимание в этом руководстве будет уделено папке «server», и поэтому наше приложение будет состоять из простого «Hello Word!» и нескольких картинок и css.
    Наша цель - получить возможность запускать сервер из директории приложения одной командой, а наш сервер будет заботиться о роутинге, HTTP заголовках и ошибках.
    $ ./start.sh
    Давайте рассмотрим сценарий запуска:
    #! /bin/bash INIFILE="$(pwd)/server/server.ini" DOCROOT="$(pwd)/public" ROUTER="$(pwd)/server/router.php" HOST=0.0.0.0 PORT=8080 PHP=$(which php) if [ $? != 0 ] ; then echo "Unable to find PHP" exit 1 fi $PHP -S $HOST:$PORT -c $INIFILE -t $DOCROOT $ROUTER
    Я предполагаю, что скрипт запускается из директории приложения, поэтому INIFILE, DOCROOT, ROUTER определяются используя pwd. Путь до php определяется используя команду which. Если php не был найден в пользовательском $PATH, то скрипт завершит работу ошибкой.
    Данный способ работает достаточно хорошо, но давайте предоставим пользователю возможность изменить любой из заданных параметров из командной строки, например:
    if [ ! -z $INIFILE ]; then INIFILE="$(pwd)/server/server.ini" fi
    Продолжим, папка «errors» содержит файлы для сообщений об HTTP ошибках. Вот пример о 403 ошибке: хотя я и использовал только HTML, скрипт будет подключен, использую include , поэтому вы можете использовать любой php код:
    403

    403: Forbidden

    Sorry, the requested resource is not accessible.

    Теперь посмотрим на router.php. Задача данного файла в получении и управлении всеми запросами и передавать их серверу, только если данный файл существует. Все страницы ошибку отображаются путём подключения шаблона.
    В первых строках я определяю некоторые глобальные параметры, такие как DIRECTORY_INDEX, директория с шаблонами ошибок. Параметр date_default_timezone_set() должен совпадать с настройками ОС, иначе будут несоответствия между записями в логе и на сервере. Так же я добавил список разрешенных IP адресов, для повышения безопасности.
    Функция logAccess() необходима, потому что когда скрипт роутинга принимает запрос лог сервера по-умолчанию игнорируется. Функция принимает только код статуса, а формат вывода полностью соответствует формату сервера.
    Наша первая задача - проверка безопасности. Если IP клиента не находится в массиве разрешенных IP, выводим сообщение об ошибке и завершаем работу скрипта. Нам необходимо отдавать код статуса отличный от 200 и функция header() не будет работать в здесь, поэтому мы используем новую функцию - http_response_code.
    Если IP клиента находится в массиве разрешенных IP, то следующий наш шаг - получение запрашиваемого пути и расширения файла. Если расширение пустое, считаем, что пользователь запрашивает папку и строим получаем путь, используя определенный сначала DIRECTORY_INDEX.
    В завершении, если запрашиваемый файл существует, возвращаем FALSE, и позволяем серверу обратиться к файлу. Если же нет, то отображается сообщение о 404 ошибке.

    Резюме

    Это всё. Как видите, php сервер просто в использовании. Наш персональный сервер очень прост. Код можно оптимизировать и включать в более сложные и функциональные классы. Happy coding!

    p.s. С радостью приму критику и замечания к переводу в личку.

    Для начала мы усовершенствуем страничку регистрации, добавив возможность загружать аватар. Исходное изображение должно быть формата jpg, gif или png. Так же оно должно быть не более 2 Мб. Не беспокойтесь, после его сжатия скриптом, размер аватара будет около 3 кб и формат jpg. Откройте страницу reg. php и допишите в теге < form > строчку enctype="multipart/form-data" ,как в примере:


    Регистрация










    Теперь сохраняем reg.php

    2.Затем необходимо создать еще одно поле в таблице users . Заходим в phpmyadmin , выбираем нужную базу и таблицу.


    Выставляем все значения, как на рисунке:

    В это поле будет записываться путь до аватара, а сам он сохраняется в отдельную папку, назовем ее «avatars». Папка будет расположена в том же каталоге, что и остальные файлы скрипта.

    3.Переходим к файлу save _ user . php и дописываем следующий код после удаления пробелов у логина и пароля:

    //удаляем лишние пробелы
    $login = trim($login);

    // дописываем новое********************************************

    //добавляем проверку на длину логина и пароля
    if (strlen($login) < 3 or strlen($login) > 15) {
    exit ("Логин должен состоять не менее чем из 3 символов и не более чем из 15.");
    }
    if (strlen($password) < 3 or strlen($password) > 15) {
    exit ("Пароль должен состоять не менее чем из 3 символов и не более чем из 15.");
    }

    if (!empty($_POST["fupload"])) //проверяем, отправил ли пользователь изображение
    {
    $fupload=$_POST["fupload"]; $fupload = trim($fupload);
    if ($fupload =="" or empty($fupload)) {
    unset($fupload);// если переменная $fupload пуста, то удаляем ее
    }
    }
    if (!isset($fupload) or empty($fupload) or $fupload =="")
    {
    //если переменной не существует (пользователь не отправил изображение),то присваиваем ему заранее приготовленную картинку с надписью "нет аватара"
    $avatar = "avatars/net-avatara.jpg"; //можете нарисовать net-avatara.jpg или взять в исходниках
    }
    else
    {
    //иначе - загружаем изображение пользователя
    $path_to_90_directory = "avatars/";//папка, куда будет загружаться начальная картинка и ее сжатая копия

    If(preg_match("/[.](JPG)|(jpg)|(gif)|(GIF)|(png)|(PNG)$/",$_FILES["fupload"]["name"]))//проверка формата исходного изображения
    {
    $filename = $_FILES["fupload"]["name"];
    $source = $_FILES["fupload"]["tmp_name"];
    $target = $path_to_90_directory . $filename;
    move_uploaded_file($source, $target);//загрузка оригинала в папку $path_to_90_directory
    if(preg_match("/[.](GIF)|(gif)$/", $filename)) {
    $im = imagecreatefromgif($path_to_90_directory.$filename) ; //если оригинал был в формате gif, то создаем изображение в этом же формате. Необходимо для последующего сжатия
    }
    if(preg_match("/[.](PNG)|(png)$/", $filename)) {
    $im = imagecreatefrompng($path_to_90_directory.$filename) ;//если оригинал был в формате png, то создаем изображение в этом же формате. Необходимо для последующего сжатия
    }

    If(preg_match("/[.](JPG)|(jpg)|(jpeg)|(JPEG)$/", $filename)) {
    $im = imagecreatefromjpeg($path_to_90_directory.$filename); //если оригинал был в формате jpg, то создаем изображение в этом же формате. Необходимо для последующего сжатия
    }
    //СОЗДАНИЕ КВАДРАТНОГО ИЗОБРАЖЕНИЯ И ЕГО ПОСЛЕДУЮЩЕЕ СЖАТИЕ ВЗЯТО С САЙТА www.codenet.ru
    // Создание квадрата 90x90
    // dest - результирующее изображение
    // w - ширина изображения
    // ratio - коэффициент пропорциональности
    $w = 90; // квадратная 90x90. Можно поставить и другой размер.
    // создаём исходное изображение на основе
    // исходного файла и определяем его размеры
    $w_src = imagesx($im); //вычисляем ширину
    $h_src = imagesy($im); //вычисляем высоту изображения
    // создаём пустую квадратную картинку
    // важно именно truecolor!, иначе будем иметь 8-битный результат
    $dest = imagecreatetruecolor($w,$w);
    // вырезаем квадратную серединку по x, если фото горизонтальное
    if ($w_src>$h_src)
    imagecopyresampled($dest, $im, 0, 0,
    round((max($w_src,$h_src)-min($w_src,$h_src))/2),
    0, $w, $w, min($w_src,$h_src), min($w_src,$h_src));
    // вырезаем квадратную верхушку по y,
    // если фото вертикальное (хотя можно тоже серединку)
    if ($w_src<$h_src)
    imagecopyresampled($dest, $im, 0, 0, 0, 0, $w, $w,
    min($w_src,$h_src), min($w_src,$h_src));
    // квадратная картинка масштабируется без вырезок
    if ($w_src==$h_src)
    imagecopyresampled($dest, $im, 0, 0, 0, 0, $w, $w, $w_src, $w_src);
    $date=time(); //вычисляем время в настоящий момент.
    imagejpeg($dest, $path_to_90_directory.$date.".jpg");//сохраняем изображение формата jpg в нужную папку, именем будет текущее время. Сделано, чтобы у аватаров не было одинаковых имен.
    //почему именно jpg? Он занимает очень мало места + уничтожается анимирование gif изображения, которое отвлекает пользователя. Не очень приятно читать его комментарий, когда краем глаза замечаешь какое-то движение.
    $avatar = $path_to_90_directory.$date.".jpg";//заносим в переменную путь до аватара.
    $delfull = $path_to_90_directory.$filename;
    unlink ($delfull);//удаляем оригинал загруженного изображения, он нам больше не нужен. Задачей было - получить миниатюру.
    }
    else
    {
    //в случае несоответствия формата, выдаем соответствующее сообщение
    exit ("Аватар должен быть в формате JPG,GIF или PNG");
    }
    //конец процесса загрузки и присвоения переменной $avatar адреса загруженной авы
    }



    // дописали новое********************************************
    // Далее идет все из первой части статьи,но необходимо дописать изменение в запрос к базе.
    //подключаемся к базе
    // проверка на существование пользователя с таким же логином
    $result = mysql_query("SELECT id FROM users WHERE login="$login"",$db);
    if (!empty($myrow["id"])) {
    exit ("Извините, введённый вами логин уже зарегистрирован. Введите другой логин.");
    }
    // если такого нет, то сохраняем данные
    $result2 = mysql_query ("INSERT INTO users (login,password,avatar) VALUES("$login","$password","$avatar")");
    // Проверяем, есть ли ошибки
    if ($result2=="TRUE")
    {
    echo "Вы успешно зарегистрированы! Теперь вы можете зайти на сайт. Главная страница";
    }
    else {
    echo "Ошибка! Вы не зарегистрированы.";
    }
    ?>

    4. Необходимо добавить одну таблицу в ту же базу. В ней будут хранится ip-адреса, которые допустили ошибки при входе. Таким образом мы сможем ограничить доступ тем, кто ошибся больше трёх раз подряд на минут 15. Думаю программам, подбирающим пароли, долго придется возиться.
    Зайдем в phpmyadmin и создадим новую таблицу с 3-мя полями:


    ip - ip-адрес.
    date - дата неудачного входа за последние 15 минут у пользователя с данным ip. col - количество ошибок за последние 15 минут у пользователя с данным ip.
    Отлично! Готово, теперь изменим файл проверки логина и пароля, ведь теперь у нас пароль зашифрован. Открываем testreg.php и удаляем все, что дальше удаления пробелов с логина и пароля. Далее добавляем следующий код:

    //удаляем лишние пробелы
    $login = trim($login);
    $password = trim($password);

    // заменяем новым********************************************
    // подключаемся к базе
    include ("bd.php");// файл bd.php должен быть в той же папке, что и все остальные, если это не так, то просто измените путь
    // минипроверка на подбор паролей
    $ip=getenv("HTTP_X_FORWARDED_FOR");
    if (empty($ip) || $ip=="unknown") { $ip=getenv("REMOTE_ADDR"); }//извлекаем ip
    mysql_query ("DELETE FROM oshibka WHERE UNIX_TIMESTAMP() - UNIX_TIMESTAMP(date) > 900");//удаляем ip-адреса ошибавшихся при входе пользователей через 15 минут.
    $result = mysql_query("SELECT col FROM oshibka WHERE ip="$ip"",$db);// извлекаем из базы количество неудачных попыток входа за последние 15 у пользователя с данным ip
    $myrow = mysql_fetch_array($result);
    if ($myrow["col"] > 2) {
    //если ошибок больше двух, т.е три, то выдаем сообщение.
    exit("Вы набрали логин или пароль неверно 3 раз. Подождите 15 минут до следующей попытки.");
    }
    $password = md5($password);//шифруем пароль
    $password = strrev($password);// для надежности добавим реверс
    $password = $password."b3p6f";
    //можно добавить несколько своих символов по вкусу, например, вписав "b3p6f". Если этот пароль будут взламывать методом подбора у себя на сервере этой же md5,то явно ничего хорошего не выйдет. Но советую ставить другие символы, можно в начале строки или в середине.
    //При этом необходимо увеличить длину поля password в базе. Зашифрованный пароль может получится гораздо большего размера.

    $result = mysql_query("SELECT * FROM users WHERE login="$login" AND password="$password"",$db); //извлекаем из базы все данные о пользователе с введенным логином и паролем
    $myrow = mysql_fetch_array($result);
    if (empty($myrow["id"]))
    {
    //если пользователя с введенным логином и паролем не существует
    //Делаем запись о том, что данный ip не смог войти.
    $select = mysql_query ("SELECT ip FROM oshibka WHERE ip="$ip"");
    $tmp = mysql_fetch_row ($select);
    if ($ip == $tmp) {//проверяем, есть ли пользователь в таблице "oshibka"
    $result52 = mysql_query("SELECT col FROM oshibka WHERE ip="$ip"",$db);
    $myrow52 = mysql_fetch_array($result52);
    $col = $myrow52 + 1;//прибавляем еще одну попытку неудачного входа
    mysql_query ("UPDATE oshibka SET col=$col,date=NOW() WHERE ip="$ip"");
    }
    else {
    mysql_query ("INSERT INTO oshibka (ip,date,col) VALUES ("$ip",NOW(),"1")");
    //если за последние 15 минут ошибок не было, то вставляем новую запись в таблицу "oshibka"
    }

    exit ("Извините, введённый вами логин или пароль неверный.");
    }
    else {
    nbsp; //если пароли совпадают, то запускаем пользователю сессию! Можете его поздравить, он вошел!
    $_SESSION["password"]=$myrow["password"];
    $_SESSION["login"]=$myrow["login"];
    $_SESSION["id"]=$myrow["id"];//эти данные очень часто используются, вот их и будет "носить с собой" вошедший пользователь

    //Далее мы запоминаем данные в куки, для последующего входа.
    //ВНИМАНИЕ!!! ДЕЛАЙТЕ ЭТО НА ВАШЕ УСМОТРЕНИЕ, ТАК КАК ДАННЫЕ ХРАНЯТСЯ В КУКАХ БЕЗ ШИФРОВКИ
    if ($_POST["save"] == 1) {
    //Если пользователь хочет, чтобы его данные сохранились для последующего входа, то сохраняем в куках его браузера
    setcookie("login", $_POST["login"], time()+9999999);
    setcookie("password", $_POST["password"], time()+9999999);
    }}
    echo "";//перенаправляем пользователя на главную страничку, там ему и сообщим об удачном входе
    ?>

    5. Полностью изменим главную страничку. Необходимо на ней вывести аватар пользователя, вывести ссылку на выход из аккаунта и добавить чекбокс для запоминания пароля при входе.
    Index.php

    // вся процедура работает на сессиях. Именно в ней хранятся данные пользователя, пока он находится на сайте. Очень важно запустить их в самом начале странички!!!
    session_start();
    include ("bd.php");// файл bd.php должен быть в той же папке, что и все остальные, если это не так, то просто измените путь
    if (!empty($_SESSION["login"]) and !empty($_SESSION["password"]))
    {
    //если существует логин и пароль в сессиях, то проверяем их и извлекаем аватар
    $login = $_SESSION["login"];
    $password = $_SESSION["password"];
    $result = mysql_query("SELECT id,avatar FROM users WHERE login="$login" AND password="$password"",$db);
    $myrow = mysql_fetch_array($result);
    //извлекаем нужные данные о пользователе
    }
    ?>


    Главная страница


    Главная страница

    if (!isset($myrow["avatar"]) or $myrow["avatar"]=="") {
    //проверяем, не извлечены ли данные пользователя из базы. Если нет, то он не вошел, либо пароль в сессии неверный. Выводим окно для входа. Но мы не будем его выводить для вошедших, им оно уже не нужно.
    print <<


    HERE;

    If (isset($_COOKIE["login"])) //есть ли переменная с логином в COOKIE. Должна быть, если пользователь при предыдущем входе нажал на чекбокс "Запомнить меня"
    {
    //если да, то вставляем в форму ее значение. При этом пользователю отображается, что его логин уже вписан в нужную графу
    echo " value="".$_COOKIE["login"]."">";
    }

    print <<




    HERE;

    If (isset($_COOKIE["password"]))//есть ли переменная с паролем в COOKIE. Должна быть, если пользователь при предыдущем входе нажал на чекбокс "Запомнить меня"
    {
    //если да, то вставляем в форму ее значение. При этом пользователю отображается, что его пароль уже вписан в нужную графу
    echo " value="".$_COOKIE["password"]."">";
    }

    Print <<



    Запомнить меня.






    Зарегистрироваться



    Вы вошли на сайт, как гость

    HERE;
    }
    else
    {
    //при удачном входе пользователю выдается все, что расположено ниже между звездочками.

    print <<
    Вы вошли на сайт, как $_SESSION (выход)


    Эта ссылка доступна только зарегистрированным пользователям

    Ваш аватар:




    HERE;

    //************************************************************************************
    //при удачном входе пользователю выдается все, что расположено ВЫШЕ между звездочками.
    }
    ?>

    6. Необходимо сделать возможность выйти из аккаунта пользователям, которые вошли. На главной странице уже была ссылка на выход. Но этого файла пока не существует. Так создадим новый файл exit.php с кодом:

    session_start();
    if (empty($_SESSION["login"]) or empty($_SESSION["password"]))
    {
    //если не существует сессии с логином и паролем, значит на этот файл попал невошедший пользователь. Ему тут не место. Выдаем сообщение об ошибке, останавливаем скрипт
    exit ("Доступ на эту страницу разрешен только зарегистрированным пользователям. Если вы зарегистрированы, то войдите на сайт под своим логином и паролем
    Главная страница");
    }

    unset($_SESSION["password"]);
    unset($_SESSION["login"]);
    unset($_SESSION["id"]);// уничтожаем переменные в сессиях
    exit("");
    // отправляем пользователя на главную страницу.
    ?>

    Ну вот и все! Пользуйтесь на здоровье! Удачи!

    Loading...Loading...