пятница, 31 октября 2008 г.

Установка Apache под Windows XP

Установка Apache под Windows XP
Сначала на каком-нибудь диске создаем рабочую директорию например LocalServer со следующей UNIX-подобной структурой подкаталогов (директорий):
\usr\local\
\home\
\etc\
скачиваем новую версию Apache с httpd.apache.org (бинарный архив для Win32 без исходников)
Далее рассматривается установка и настройка новой на данный момент версии apache 2.2
Для удобства дальнейшей работы и сокращения пути к рабочим директориям прикрутим к основной директории из примера E:\LocalServer временный виртуальный диск X.
Под Windows назначением букв виртуальных дисков заведует утилита по кличке SUBST.
Узнать её ключи можно набрав в коммандной строке сначала cmd, и далее subst /?
Для облегчения работы, чтобы не набирать при каждом сеансе комманды, напишем в соостветствии с синтаксисом subst пакетный файл, который будет содержать комманду назначения пути для виртуального диска X:
@echo off
subst X: ..
Сохраняем этот текстовый файл с расширением .bat в каталоге \etc
Две точки на месте пути в коммандном файле указывают на выход по дереву каталогов на уровень выше. Таким образом данный коммандный файл не зависит от конкретного своего местоположения - он всегда будет присваивать директории уровнем выше виртуальный диск с меткой X
Далее можно сделать ярлык на этот коммандный файл и поместить его в любое удобное место, откуда его будет легко запускать по мере надобности.
Например сразу перед установкой Apache.
Дистрибутив Apache 2.2 упакован инсталлятором Microsoft Windows Installer. Запускаем. В полях сначала пишем:
Network Domain: .
Server Name: localhost
Aministrator's Email: vasya@pupkin
и указываем нужный путь установки X:\usr\local\apache
Пришло время настройки параметров сервера apache 2.2
Конфигурационный файл httpd.conf находится по адресу X:\usr\local\apache\conf\ Это обычный текстовый файл, который можно открыть и редактировать в любом текстовом редакторе начиная с notepad. Полезно также читать комментарии (на английском, после знака #) в этом самом файле как и документацию на сайте Apache.
Раскомментировать (т.е. убрать знак #) ServerName localhost
DocumentRoot - то место, где будут помещаться html-файлы. Отведем для этой цели отдельную директорию. точнее создадим сразу \home\localhost\cgi и \home\localhost\www
Исправить
Listen 8080
на
Listen 80

И далее пропишем
DocumentRoot "X:/home/localhost/www"

Все установки по умолчанию (by default) будут прописаны в блоке следующего вида
<Directory X:/>
Options Indexes Includes
AllowOverride All
Order allow,deny
Allow from all
</Directory>

Найти и удалить аналогичный блок для документов
<Directory "X:/usr/local/apache/htdocs">
...
</Directory>
т.к. настройки для всех директорий должны наследоваться.

Далее дописываем
DirectoryIndex index.html index.htm
Исправляем
ScriptAlias /cgi-bin/ "X:/usr/local/Apache/cgi-bin/"
на "X:/home/localhost/cgi/"
дописываем строку
ScriptAlias /cgi/ "X:/home/localhost/cgi/"
эти строки указывают псевдонимы, т.е. если произойдет обращение к скрипту по URL, содержащему /cgi-bin/ или /cgi/, то обращаться в обоих случаях следует к каталогу X:/home/localhost/cgi/

Отдельно прописанные настройки для каталога /cgi-bin в
<Directory "X:/usr/local/apache/cgi-bin">
...
</Directory>
также удаляем.

Ищем строку AddHandler cgi-script .cgi (она закомментирована), удаляем знак комментария # и дописываем еще пару расширений файлов:
AddHandler cgi-script .cgi .bat .pl .exe
это значит, что все файлы с указанными расширениями будут обрабатываться как CGI-скрипты.

Найти и раскомментировать
AddType text/html .shtml
AddOutputFilter INCLUDES .shtml .html .htm

Сохранить изменения и закрыть файл httpd.conf

четверг, 30 октября 2008 г.

Авторизация

Сначала скрипт посылает браузеру такой HTTP-заголовок

WWW-Authenticate: Basic realm="имя_зоны"
HTTP/1.0 401 Unauthorized

имя_зоны - это некий идентификатор, определяющий к каким ресурсам будет разрешен доступ зарегистрированным пользователям.
После того как пользователь ввел login и password отправляется HTTP-ответ в виде

Authorization: Basic a2DdLFt7tT56yNH5dJ4==

- это закодированные данные, введенные пользователем.
Если авторизация верна, пользователю садится cookie на одну сессию, чтобы ему не приходилось каждый раз при переходе со страницы на страницу внутри заданной зоны снова регистрироваться. HTTP-ответ в этом случае выглядит так
Authorization: Basic значение_cookie
После верной авторизации устанавливается переменная окружения REMOTE_USER, содержащая login пользователя. Она может быть задействована для определения какой именно пользователь зарегистрировался.

Cookies

Это небольшие порции информации, создаваемые скриптом и находящиеся на компьютере пользователя с возможностью чтения и записи их тем же скриптом. Служат для идентификации пользователя. Содержат время собственной жизни (дату истечения), имя сервера, установовщего cookie, и каталога, где находился скрипт-хозяин в момент установки.
Имя сервера и каталога нужно для того, чтобы скрипт мог получить доступ к cookies. Браузер посылает скрипту данные только тех cookies, которые были установлены с данного сервера и из данного каталога (и всех его подкаталогов). Таким образом получить доступ к чужим cookies невозможно - браузер их просто не посылает скрипту.
Устанавливается cookie, точнее активируется со стороны сервера путем отправки компьютеру пользователя HTTP-заголовка Set-Cookie, который предшествует заголовку content-Type:
Set-cookie: name=значение; [expires=дата;] domain=имя_хоста; path=URI_каталога; [secure]
активировать cookie можно и при помощи HTML-тега <meta>:
<meta http-equiv="Set-Cookie"
content="name=значение; [expires=дата;] domain=имя_хоста; path=URI_каталога; [secure]" />
значения параметров:
- name - заменить на имя/название cookie
- value - текст, который и есть значение cookie
- expires=дата - необязательно для использования. Тогда время жизни cookie истекает с закрытием окна браузера.
Иначе может иметь вид expires=Friday, 01-Oct-10 13:58:00 GMT
- domain - доменное имя хоста. Может быть изменено вручную! Если параметр не задан, имя хоста браузер определяет автоматически.
- path - URI каталога в котором расположен сценарий (скрипт), установивший cookie.
- secure - параметр связан с защищенным протоколом HTTPS

Получить доступ к cookies скрипт может через переменную окружения HTTP_COOKIE, где они хранятся в виде cookie1=значение1;cookie2=значение2

среда, 29 октября 2008 г.

Загрузка файлов

Т.к. размер файлов велик, то для их передачи по протоколу HTTP URL-кодировка (т.е. адресная строка браузера) не используется. А это значит, что метод GET в данном случае неприменим! Используется метод POST.
Для этого в теге <form> задается атрибут enctype="multipart/form-data"
Поступившие из такой формы данные выглядят в HTTP-протоколе как несколько блоков с разделителем и идентификатором начала:
-------------------идентификатор_начала\n
Content-Disposition: form-data; name="имя"\n
\n
значение\n

Еще необходимо вставить тег загрузки файла
<input type="file"
name="имя файла"
/>
который отображается в браузере в виде текстового поля с кнопкой "Browse".

Типы <input /> : разные поля ввода

<input type=text
name=имя
[value=значение]
[size=размер]
[maxlength=число]
/>
Полагаться на заданную максимальную длину строки и из этих соображений выделять ограниченную область памяти не стоит, т.к. передача параметров возможна не только через заготовленное поле ввода и тогда может произойти переполнение выделенного участка памяти, что приводит к системной ошибке в результате которой неавторизованным лицом может быть получен доступ к непредназначенной для него информации.

<input type="password" />

<input type="hidden" /> - для скрытой служебной информации (?! security issue ?!)

<input type="checkbox" - независимый переключатель
name="имя"
[value="checked"]
/>

<input type="radio" - зависимый переключатель
name="имя"
[value="checked"]
/>

<input type="submit" - кнопка отправки формы
[name="имя"]
value="SUBMIT"
/>

<input type="reset" - кнопка сброса формы
value="СБРОС"
/>
из эргономических соображений применять не рекомендуется

<input type="image" - рисованная кнопка для отправки
[name="имя"]
src="URL_изображения"
/>
передаются также координаты клика в виде имя.x=X_координата&имя.y=Y_координата
Если атрибут name не задан, то координаты отправляются в виде x=X&y=Y

<input type="file" - тег загрузки файла
name=имя_файла
/>


<textarea - многострочное текстовое поле
name="имя"
[cols="число_столбцов"][rows="число_строк"] - размеры поля
[wrap="тип_отображения"]
> Текст по умолчанию </textarea>
Типы отображения:
virtual - с полосой прокрутки и переносом по словам
physical - зависит от браузере, похож на none
none - так как вводится. По мере надобности появляются полосы прокрутки


<select name="имя" size="размер_числом_сток" [multiple]> - выпадающий либо раскрытый список
<option [value1="значение_1"][selected]>Строка_1</option>
...
<option [valueN="значение_N"][selected]>Строка_N</option>
</select>
атрибут multiple не имеет смысла для списка размером в 1 строку, т.е. для выпадающего списка.

Формы в HTML

делятся по именам тегов на 3 категории
<input ... />
<textarea ... > </textarea>
<select ...><option ...> </option> </select>
Если в теге не задан параметр name=, то тогда это значение не передается в QUERY_STRING
Без имени прописываются служебные элементы, значения которых незачем посылать сценарию или же такие элементы, которые используются в JavaScript.
<form action="/cgi-bin/script.cgi">
... some fields...
<input type="submit" value="START!" />
</form>

Скрипты: а не писать ли на C?

Писать скрипты (сценарии) можно и на языках типа C. Ясно, что в этом случае программа должна быть откомпилирована. Преимущество откомпилированной C-программы состоит в быстродействии, но недостаток в том, что компилированный код неуниверсален. Так, компилированная под Win32 программа не будет выполняться на UNIX-сервере. И наоборот. Это не очень удобно, мягко говоря. Да зачастую и не нужно для небольших приложений, т.к. в них едва ли разница в быстродействии будет заметна. Но в случае крупных поисковиков быстродействие является решающим.

Еще о переменных окружения

Перед запуском скрипта сервер передает ему следующие заголовки, однако не все из них (все заголовки получить нельзя):
HTTP_ACCEPT
HTTP_REFERER
HTTP_USER_AGENT
HTTP_HOST (хорошо использовать эту переменную окружения при прописывании URL с целью отвязки от конкретного хоста и в комманде Location)
SERVER_PORT - порт сервера, к которому обратился браузер
REMOTE_ADDR - IP-адрес узла с которого пришел запрос
REMOTE_PORT - порт с которого пришел запрос (порт на котором обычно работает браузер пользователя)
SCRIPT_NAME - это виртуальное имя выполняющегося скрипта (часть URI до символа ?) Эту переменную хорошо использовать в комманде Location при переадресации на себя (self-redirect) и при проставлении значения аттрибута action в теге <form> для отвязки от конкретного имени скрипта.
REQUEST_METHOD - GET, POST или иной метод. Грамотно составленный скрипт должен сам определять какой метод будет использоваться.
QUERY_STRING
CONTENT_LENGTH

вторник, 28 октября 2008 г.

Заголовки ответа в HTTP-формате

Первая строка ответа сервера на выдачу документа выдлядит так
HTTP/1.1 OK
или если документ не найден, тогда так
HTTP/1.1 404 Not Found
Этот заголовок ответа может быть подделан с помощью комманды
Status: 404 Not Found
Сама комманда Status в виде заголовка не передается, так что пользователь не сможет узнать был ли заголовок отманипулирован этой коммандой.Однако эта комманда может и не сработать на PHP если оный установлен на сервере Apache в виде модуля и внешнего скрипта.

Content-Type: mime_type; charset=win-1251
mime_type:
- text/plain - обычный текст
- text/html - HTML-документ
- image/jpeg - изображение в JPEG-формате
и т.д.
Этот заголовок задает тип документа и его кодировку.

Pragma
Применения этого заголовка разносторонни.
Один из примеров:
Pragma: no-cache
Запрещает кэширование документа браузером - полезно для часто обновляющихся страниц со статистикой например.

Location: URL
осуществляет перенаправление пользователя по заданному URL без загрузки первоначально запрошенной страницы.По сути это redirect.

Set-cookie: cookie_param
Устанавливает cookie в браузер.

Date: Mon, 27 Oct 2008 13:23:47 GMT
Дата отправки документа

Server: Apache/2.2 (Unix) PHP/5.0.1

Common Gateway Interface и формат HTTP-запроса

CGI=Common Gateway Interface - это набор соглашений для веб-приложений.

формат HTTP-запроса

GET script.php?param HTTP1.0\n
... other info ...
\n\n

Переменные окружения (Environment Variables)
REQUEST_URI
QUERY_STRING
REQUEST_METHOD

URL=Universal Resource Locator (i.e. example.com:80/somepath/script.php?param )
URI=Universal Resource Identifier (i.e. somepath/script.php?param )

Формат HTTP-запроса методом GET
GET script.php?param HTTP1.0
здесь
QUERY_STRING = param
REQUEST_METHOD = GET

Формат HTTP-запроса методом POST
POST script.php?param HTTP1.0
здесь
QUERY_STRING = param
REQUEST_METHOD = POST
Отличие от запроса методом GET в том, что параметры param могут передаваться не только через коммандную строку, но и в самом конце после всех заголовков.

CONTENT_TYPE (переменная окружения)
Content-Type: application/x-www-form-urlencoded (используется методами GET и POST)
либо
Content-Type: mulipart/form-data
Сервер не интерпретирует заголовок, а передает его скрипту (=сценарию) через переменную окружения.

HTTP_HOST - эта переменная окружения присутствует в протоколе HTTP 1.1
Host: имя_хоста
HTTP_HOST=/=SERVER_NAME в общем случае
Но HTTP_HOST=SERVER_NAME в частном случае, когда в конфигурации сервера Apache указано UseCanonicalName off с тем отличием, что SERVER_NAME не содержит номера порта.

HTTP_USER_AGENT
User-Agent: Firefox/3.0 [en] (WinNT5.1)
сообщает версию браузера и операционки + язык

HTTP_REFERER
Referer: URL
передает адрес веб-сайта, с которого осуществляется переход. Эта переменная подвержена манипуляции.

CONTENT_LENGTH
Content-length: длина
используется в случае метода POST и содержит длину данных в байтах в десятичном формате. Если используется метод GET, то значение пусто и данный заголовок не применяется.

HTTP_COOKIE
Cookie: значения_cookie (в URL-формате)

HTTP_ACCEPT
Accept: text/html, text/plain, image/jpeg ( либо */* )
браузер сообщает какие типы данных он понимает

Можно послать запрос через telnet в формате HTTP-протокола, вводя руками
telnet blogger.com 80
GET index.html HTTP/1.1
Host: blogger.com
после каждой строки нажимать клавишу Enter, а после последней два раза Enter (эквивалентно n\n\ в HTTP-протоколе).
Тогда можно видеть не только html-код страницы, но и информацию о дате последнего изменения страницы а также на какой машине расположен хост.
В частности таким образом можно узнать, что народный хостинг "не за деньги" (а не бесплатный) narod.ru от компании Яндекс работает на машинах ZX_Spectrum/1997 (Sinclair_BASIC).

Кодировка URL
Поскольку в случае использования метода GET данные передаются через адресную строку браузера, то они передаются в т.н. URL-кодировке, которая представляет собой 1-байтную кодировку наподобие ASCII. Буквы иных кроме английского алфавитов кодируются в шестнадчатеричном формате с предшествующим символом %: %3C

понедельник, 27 октября 2008 г.

Первые сведения по PHP. Сеть, адресация, протоколы.

Для начала пара полезных ресурсов в сети:

  • php.net

  • phpclub.ru

  • php.su

  • woweb.ru

  • Котеров Д. В "PHP 5 в подлиннике"


Сначала речь пойдет о структуре сети Интернет и протоколе передачи гипертекстовых данных HTTP.
Немного подробнее про HyperText Transfer Protocol.
Это протокол для передачи данных по сети интернет. Протоколов существует множество. Один протокол может передавать данные посредством другого протокола, т.е. как-то преобразовывать полученные данные и результат передавать для дальнейшей обработки следующему протоколу. В случае с HTTP последовательность примерно такова:   HTTP → TCP → IP → (драйвер сетевой карты) → (аппаратная часть, физические сигналы) → (сеть: кабели) → (и обратный процесс).
Такое наслоение протоколов называют стеком. На самом деле TCP и IP протоколы тесно связыны, поэтому часто пишут TCP/IP. Соответственно весь этот пирог из протоколов называют TCP/IP-стеком. Но несмотря на столь тесную связь нижний протокол не знает о существовании верхнего протокола, отработал, отдал данные и забыл, что там далее с ними происходит его не интересует ну совершенно.
TCP/IP-протокол устроен так, что выбирает самый оптимальный по времени путь доставки информации адресату. При этом опрашиваются ближайшие соседи, знают ли они чего о таком-то адресате, а те опрашивают своих ближайших соседей и т.д. Информация при этом разбивается на куски - пакеты - и этими пакетами доставляется. При этом протокол работает так, что ни один пакет не теряется: если в результате каких-либо помех пакет не проходит, то он отправляется повторно.
Адресация в сети происходит по IP-адресу. Это что-то вроде телефонного номера. В 4-й версии протокола IP адрес выглядит как набор из четырех чисел в диапазоне от 0 до 255, разделенных точкой.
Например 123.12.234.5
Нетрудно посчитать кол-во возможных в 4-й версии IP-адресов - это 2^32, т.е. несколько больше 4-х миллиардов. Уже сейчас народу больше. Не у всех правда доступ в сеть имеется пока что, но IP-адрес присваевается ведь не человеку. Потребности растут одним словом. Поэтому уже сейчас переходят на 6-ю версию интернет-протокола (IPv6), где адрес выглядит как 8 групп шестнадцатеричных (! а не десятичных как в IPv4 !) цифр, разделенных двоеточием.
2001:db8:85a3:0:0:8a2e:370:7334
IPv6 - это 128-битный протокол (в отличие от 32-битного IPv4), которым можно адресовать 2^128 узлов сети. Это около 3,4x10^38 адресов!
Но общение машин между собой по HTTP или TCP/IP-протоколу это ведь не самоцель. Цель в том, чтобы передать нужную информацию пользователю, который работает с какой-то программой. То есть данные надо как-то еще и передать из этой программы, а потом вернуть ей ответ. Это достигается опять-таки посредством TCP/IP-протокола, который в начале соединения присваивает программе, инициировавшей соединение с сетью, один из незанятых номеров в диапазоне от 0 до 65535 (2^16 - 1) - этот номер именуется портом. Тогда адресация конкретной программы выглядит как (IP-адрес):(номер порта)
Например 123.12.234.5:80
Некоторые порты зарезервированы за определенными программами, например 21-й порт для протокола FTP.
Сеть состоит из узлов, которыми физически являются сервера и клиентские машины с присвоенными им IP-адресами. Строго говоря, один физический сервер может содержать несколько узлов, которые в свою очередь могут содержать несколько хостов либо с выделенным IP и тогда такой хост естественно может адресоваться прямо по IP-адресу, либо без выделенного IP, когда на одном IP висят несколько хостов - их уже нельзя адресовать по IP-адресу - это виртуальные хосты. Далее, хосты содержат сайты, состоящие либо из статических html-документов, либо из динамических документов, когда конечный, отдаваемый пользователю документ формируется скриптом на лету. PHP как раз и является одним из тех самых скриптовых языков, способных на такое.

воскресенье, 26 октября 2008 г.

Ошибки blogger'а

Бывают ошибк, bX-code всякие там. Тут есть о них: bx-errorcode.blogspot.com

Зачем учить PHP ?

Зачем я вообще за это дело взялся?
тут как всегда несколько причин:
- люблю изучать что-то новое
- имею клиническую склонность к точным наукам
- давно хотел разобраться в веб-технологиях и это должно стать первым шагом (понимание HTML/CSS не считается)
Плюс - и это наверное самое главное - раньше слышал краем уха, а сейчас еще и начитался всяких бомжей и решил вот попробовать раздобыть бабла из Сети.
Только я им не верю, когда говорят, что якобы для успешного баблоруба языков программирования знать не надо.Живи на рефералах, то есть строй свою MLM-подобную реферальную сеть путем проезда по ушам. А когда аудитория достаточно увеличится можно начать и рекламу прикручивать и платные посты печатать. Впрочем для тех, кто ничего больше не умеет кроме как бакланить и не желает напрягаться, приобретая новые знания и умения, и это выход, не поспоришь. Интересно однако какой же можно ожидать толк от MLM-сети, состоящей из людей, которые любят, чтобы им повесили лапшу на уши и хотят срубить сразу много бабла по-легкому, не напрягаясь, то есть серьезно работать просто не настроены? По-моему толка от такой аудитории в долгосрочной перспективе мало вплоть до ровно никакого. А это значит, что для обеспечения более-менее постоянного дохода нужно все с тем же упорством ездить по ушам. Почему-то мне это не кажется ни реальным, ибо когда-то темы сойдут на нет, самому надоест или аудитория начнет терять интерес, ни перспективным всю жизнь строить одну за другой MLM-пирамиды.
Существенные и стабильные доходы с такой деятельности - так бывает только в сладком сне.
Нужно жить своим умом и не только слушать, что рассказывают другие (вспомним "Ну и Вы говорите!"), но еще и смотреть, что эти другие ДЕЛАЮТ!
Везде нужно сначала вложить труд, произвести работу, чтобы получить видимый результат. Это закон физического мира такой.
Я пишу это больше для себя, чтобы всегда понмить об этом. И я не вовсе не стремлюсь стать известным и не буду предпринимать никаких шагов по раскрутке этого дневника. Как только изучение закончится, тема умрет и будет служить разве что моими личными электрическими заметками.
Итак, почему все же PHP теперь с технической точки зрения:
- это одна из самых распространенных на сегодя веб-технологий
- которая не собирается помирать в ближайшее время.
Убедиться можно здесь: www.tiobe.com/index.php/tiobe_index
Кстати Perl где-то с 2006 начал помирать, а вот Python и Ruby набирают популярности. Надо это заметить.