JavaScript notes

JavaScript — язык со слабой динамической типизацией, автоматическим управлением памятью и прототипным наследованием.JavaScript состоит из трёх обособленных частей:

  • ядро (ECMAScript),
  • объектная модель браузера (Browser Object Model или BOM),
  • объектная модель документа (Document Object Model или DOM).

В статье, в основном, пойдёт речь о ядре. Конечно, в примерах кода будут использоваться элементы DOM и BOM, но заострять на них внимание не буду.

 

Continue reading «JavaScript notes»

Указание опций PHP

Директивы для конфигурирования PHP можно размещать не только в файле php.ini, но также и в конфигурационных файлах Apache для вашего сайта – .htaccess. Это позволяет проводить тонкую настройку php для разных директорий.

Для работы с PHP в конфигурационных файлах Apache доступны 4 директивы: php_valuephp_flagphp_admin_value,php_admin_flag, которые отличаются значимостью, типом устанавливаемых значений и местом применения.

Директивы php_admin_valuephp_admin_flag выставляются только в файле httpd.conf, так что нам они не интересны. По сути, данные директивы переопределяют значение остальных директив.

Директива php_flag служит для установки логических значений директив в php.ini. В то время как директива php_valueслужит для установки строковых и числовых значений директив php.ini, т.е. любых типов значений, за исключением логических.

Синтаксис директив очень прост:

php_flag  имя директивы on | off
php_value  имя директивы VALUE

Приведем перечень наиболее часто используемых директив

MYSQL.DEFAULT_HOST

Устанавливает имя хоста базы данных.
Пример: php_value mysql.default_host localhost

MYSQL.DEFAULT_USER

Устанавливает имя пользователя базы данных
Пример: php_value mysql.default_user alexey

MYSQL.DEFAULT_PASSWORD

Устанавливает пароль пользователя базы данных
Пример: php_value mysql.default_password Hry5Gw2

DISPLAY_ERRORS

Разрешает вывод ошибок и предупреждений в браузер.
Пример: php_flag display_errors 0

DISPLAY_STARTUP_ERRORS

Включает отображение ошибок, возникающих при запуске PHP.
Пример: php_flag display_startup_errors 0

ERROR_REPORTING

Определяет типы (уровни важности) фиксируемых ошибок.
Пример: php_value error_reporting “E_ALL & ~E_NOTICE”

AUTO_PREPEND_FILE

Определение файла, который будет выводится в начале каждого php-скрипта. Путь указывается от корня файловой системы сервера.
Пример: php_value auto_prepend_file /www/server/prepend.php

AUTO_APPEND_FILE

Определение файла, который будет выводится в конце каждого php-скрипта.
Пример: php_value auto_append_file /www/server/append.php

SENDMAIL_FROM

Устанавливает e-mail отправителя, который применяется при отправке почтовых сообщений с помощью PHP.
Пример: php_value sendmail_from root@beget.ru

USER_AGENT

Устанавливает строку User-agent, которая используется PHP при обращении к удаленным серверам.
Пример: php_value user_agent “Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)”

Например, для вывода всех сообщений об ошибках генерируемых php в .htaccess нужно прописать следующие строки:

php_flag  display_errors 1
php_flag  display_startup_errors 1
php_value  error_reporting “E_ALL & ~E_NOTICE”

Для запрещения выполнения php в текущей директории и во всех вложенных необходимо в .htaccess прописать следующие строки:

php_flag engine  off

Паролирование директорий

.htaccess можно так же использовать для установки пароля на доступ к определенным папкам, файлам и группам файлов. Приведем рабочий пример, а потом поясним все содержимое:

AuthName "Protected area, need authorization"
AuthType Basic
AuthUserFile /home/t/test/.authfile
require valid-user

Данный файл нужно положить в ту директории, на которую мы хотим поставить пароль.

Директива AuthName выводит сообщение при запросе пароля, все сообщение необходимо писать в одну строчку, синтаксис директивы тривиален:

AuthName "SEE TEXT"

Директива AuthType выбирает тип аутентификации. Возможны следующие типы: Basic или Digest. Второй может не поддерживаться некоторыми браузерами, поэтому пользоваться им не рекомендуется.

AuthType Basic | Digest

AuthUserFile указывает имя файла с паролями для аутентификации пользователей (пароли в этом файле будут шифрованными). Путь к файлу с паролями задается относительно корня веб-сервера. Храните файл с паролями в папке, доступ к которой закрыт для пользователей — (желательно поместить этот файл вне иерархии вашего веб-сайта).

Создать данный файл можно двумя способами. Если у Вас установлена операционная система семейства Windows вы можете скачать отсюда программу которая генерирует данный файл. Либо подключится к серверу по SSH (инструкцию по подключению можно найти тут) и воспользоваться утилитой htpasswd.

Запустив htpasswd без параметров мы увидим:

beget@ginger ~ # htpasswd
Usage:
htpasswd [-cmdps] passwordfile username
htpasswd -b[cmdps] passwordfile username password
-c Create a new file.
beget@ginger ~ #

Здесь не будут рассматриваться все параметры этой команды, но вы можете сами прочитать подробности, запустивhtpasswd в unix shell или ознакомившись с соответствующей страницей документации по Apache.

Итак, изначально у нас еще нет файла с паролями и нам нужно его создать:

beget@ginger ~ # htpasswd -c authfile test1
New password:
Re-type new password
Adding password for user test1
beget@ginger ~ #

Здесь не будут рассматриваться все параметры этой команды, но вы можете сами прочитать подробности, запустивhtpasswd в unix shell или ознакомившись с соответствующей страницей документации по Apache.

После выполнения данной операции htpasswd создаст файл passwords, в котором окажется пользователь test1 и его пароль в зашифрованном виде:

beget@ginger ~ $ cat .authfile
   test1:zgco1KREjBY8M
 beget@ginger ~ $

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

beget@ginger ~ # htpasswd .authfile test2
New password:
Re-type new password:
Adding password for user test2
beget@ginger ~ $ cat .authfile
test1:zgco1KREjBY8M
test2:eN3uA6t0kzV1c
beget@ginger ~ $

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

Require USER_NAME | valid-user

Указывая valid-user, вы разрешаете доступ всем пользователям, перечисленным в файле паролей.

Приведем пример для доступа определенных пользователей из файла с паролями .htpasswd

AuthName "Protected area, need authorization"
AuthType Basic
AuthUserFile /home/t/test/.authfile
require Alexey Kondr Fenix

Так же как и с запретом доступа по IP здесь можно использовать расширение <Files> ниже приведены два примера: установки пароля на группу файлов и на один определенный файл.

<Files "passwd.html">
  AuthName "Protected area, need authorization"
  AuthType Basic
  AuthUserFile /home/t/test/.authfile
  require valid-user
</Files>

 

<Files ".(key)$">
  AuthName "Protected area, need authorization"
  AuthType Basic
  AuthUserFile /home/t/test/.authfile
  require valid-user
</Files>

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

Управление доступом

Очень часто возникает необходимость запретить доступ к определенным файлам или папкам для определенных групп пользователей. В Web сервере Apache есть встроенные средства для решения данной проблемы.

Для запрета или разрешения доступа ко всем файлам и папкам в текущей и во всех вложенных директориях используется директива Order синтаксис ее очень прост:

Order [Deny,Allow] | [Allow,Deny]

# По умолчанию Deny,Allow

В зависимости от того в каком порядке указаны директивы меняется логика работы сервера. В случае если Deny,Allow то запрещается доступ со всех IP кроме оговоренных, в случае если Allow,Deny разрешается доступ со всех IP кроме оговоренных. Далее должны идти секции описания для доступа и запрета. Ключевое слово all означает со всех IP

Например, мы хотим запретить (блокировать) доступ с IP 81.222.144.12 и 81.222.144.20 и разрешить всем остальным нам необходимо добавить в .htaccess следующий код:

Order Allow,Deny
Allow from all
Deny from 81.222.144.12 81.222.144.20

Для обратной ситуации, когда мы хотим запретить доступ со всех IP кроме 81.222.144.12 и 81.222.144.20 нам необходимо добавить в .htaccess следующий код:

Order Deny,Allow
Deny from all
Allow from 81.222.144.12 81.222.144.20

Запрет или разрешение на доступ можно указывать не только на все файлы, но так же можно указывать на отдельный файл или группы файлов. Например, мы хотим запретить доступ всех пользователей кроме IP 81.222.144.12 к файлуpasswd.html, который расположен в текущей директории.

<Files "passwd.html">
  Order Deny,Allow
  Deny from all
  Allow from 81.222.144.12
</Files>

Так же можно запретить или разрешить доступ к определенной группе файлов. Например, к файлам с расширением «.key«:

<Files ".(key)$">
  Order Deny,Allow
  Deny from all
  Allow from 81.222.144.12
</Files>

 

Кодировка

Иногда браузер пользователя не может корректно определить тип кодировки выдаваемого документа. Для решения этой проблемы используемая кодировка указывается в настройках Web сервера Apache и заголовке передаваемого документа. Причем для корректного распознания эти кодировки должны совпадать. На наших серверах по умолчанию используется кодировка cp1251

В HTML для указания кодировки используется тег:

[cc name=»1″/]

Наиболее часто встречаются типы кодировки для русского языка передаваемые в заголовке документа:

  • Windows-1251 — Кириллица (Windows).
  • KOI8-r — Кириллица (КОИ8-Р)
  • cp866 — Кириллица (DOS).
  • Windows-1252 — Западная Европа (Windows).
  • Windows-1250 — Центральная Европа (Windows).
  • UTF-8 — двух байтовая кодировка

Теперь рассмотрим указание кодировки по умолчанию через .htaccessAddDefaultCharset задает дефолтную таблицу символов (кодировку) для всех выдаваемых страниц на веб сервере Apache. Указываем кодировку на все файлы, в которой по умолчанию получает документы браузер:

[cc name=»2″/]

При загрузке файла на сервер, возможна перекодировка, его — указываем, что все получаемые файлы будут иметь кодировку windows-1251, для того что бы указать кодировку на загружаемые файлы напишем:

[cc name=»3″/]

Если необходимо отменить перекодировку сервером файлов:

[cc name=»4″/]

Обработка ошибок

В ходе работы сервера иногда возникают ошибки, скорее это будет правильней назвать не сбоями в работе сервера, а стандартными кодами возврата оговоренными в стандарте HTTP_RFC2616. Вообще, в RFC ошибки называются «Status Codes«, но мы их будем называть именно ошибками — так привычнее.

Код возврата — это трехзначное число, на основании которого можно судить о том, насколько успешно был обработан запрос. Код возврата начинающиеся на 1,2,3 считаются успешными, остальные причисляются к разряду ошибок. 

[cc name=»1″/]

При возникновении ошибки 4xx или 5xx посетитель Вашего сайта увидит в браузере сообщение от сервера, которое вряд ли можно назвать предельно понятным рядовому пользователю. Apache предоставляет возможность выдать вместо аскетичного технического текста, не изобилующего деталями, свою страницу, где Вы можете человеческим языком объяснить пользователю, что произошло и что делать.
Пример переопределения страниц ошибок приведен ниже:

[cc name=»2″/]

Более подробно об обработке ошибок можно прочитать в документации по Apache на странице «Custom error responses».

Индексные страницы

Когда пользователь заходит на хост например http://gentoo.org принято, что открывается индексный файл index.* при его отсутствии — либо содержимое каталога, либо ошибку 403 (FORBIDDEN) если опция отключена — запрещен просмотр директорий.

За листинг файлов отвечает директива Indexes (показывать посетителю список файлов, если в выбранном каталоге нет файла index.html или его аналога).

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

[cc name=»1″/]

А чтобы выдавал листинг, нужно:

[cc name=»2″/]

Если же понадобиться разрешить просматривать список файлов, но чтобы при этом чаcть файлов определенного формата не отображалась, то запишем:

[cc name=»3″/]

Выдает листинг каталога, т.е. его содержание со всем содержанием, за исключением файлов-скриптов PHP и Perl.

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

[cc name=»4″/]

Если же вы хотите что бы при обращении к каталогу открывался не index.html, а например, файл htaccess.php или /cgi-bin/index.pl:

[cc name=»5″/]

Директивы сложного перенаправления (mod_rewrite)

Модуль mod_rewrite имеющийся в составе Apache — это мощнейшее, интеллектуальное средство преобразования URLадресов. С ним возможны почти все типы преобразований, которые могут выполняться или нет в зависимости от разных условий, факторов.

Данный модуль представляет собой основанный на правилах механизм (синтаксический анализатор с применением регулярных выражений), выполняющий URL преобразования на лету. Модуль поддерживает неограниченное количество правил и связанных с каждым правилом условий, реализуя действительно гибкий и мощный механизм управления URL. URL преобразования могут использовать разные источники данных, например переменные сервера, переменные окружения, HTTP заголовки, время и даже запросы к внешним базам данных в разных форматах, — для получения URLнужного вам вида.

Директива RewriteCond — определяет условие, при котором происходит преобразование. RewriteCond определяет условия для какого-либо правила. Перед директивой RewriteRule располагаются одна или несколько директивRewriteCond. Следующее за ними правило преобразования используется только тогда, когда URI соответствует условиям этой директивы и также условиям этих дополнительных директив.

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

Continue reading «Директивы сложного перенаправления (mod_rewrite)»

Разбираемся с файлом .htaccess

Apache — самый распространённый HTTP сервер. Распространяется бесплатно, включая исходные тексты.Поддерживаются сценарии на CGI (включая FastCGI), PHP, perl, Java. Аутентификация — базовая, message-digest, TLS (SSL). С апреля 1996 это самый популярный HTTP-сервер в Интернете; в августе 2007 года он работал на 51 % всех веб-серверов.

htaccess — файл дополнительной конфигурации веб-сервера Apache, а также подобных ему серверов. Позволяет задавать большое количество дополнительных параметров и разрешений для работы веб-сервера у отдельных пользователей (а так же на различных папках отдельных пользователей), таких как управляемый доступ к каталогам, переназначение типов файлов и т.д., не предоставляя доступа к главному конфигурационному файлу т.е. не влияя на работу всего сервиса целиком.

.htaccess является подобием httpd.conf с той разницей, что действует только на каталог, в котором располагается, и на его дочерние каталоги. Возможность использования .htaccess присутствует в любом каталоге пользователя.

Файл .htaccess может быть размещен в любом каталоге. Директивы этого файла действует на все файлы в текущем каталоге и во всех его подкаталогах (если эти директивы не переопределены директивами нижележащих файлов.htaccess).

Директивы .htaccess предоставляют пользователю широкий выбор возможностей по настройке своего сайта, список всех доступных директив можно посмотреть тут. Ниже я опишу только самые востребованные (на мой взгляд) директивы:

Вот еще несколько полезных ссылок по теме:

Директивы простого перенаправления (редирект)

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

[cc name=»1″/]

более сложный пример, мы хотим определенные страницы нашего сайта переадресовывать на другие сайты

[cc name=»2″/]

теперь при наборе http://mysite.ru/linux будут открываться http://www.linux.org. В последнем примере WEB сервер будет передавать код 301, что означает «документ перемещен постоянно».

Синтаксис команды Redirect выглядит следующим образом:

[cc name=»3″/]

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

[cc name=»4″/]

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

В регулярном выражении можно использовать любые печатные символы и пробел, но часть символов имеет особое значение:

  • Круглые скобки () используются для выделения групп символов. В дальнейшем к ним можно обращаться по номеру.
  • Символ ^ обозначает начало строки.
  • Символ $ обозначает конец строки.
  • Символ . обозначает любой символ.
  • Символ | обозначает альтернативу. Например, выражения «A|B» означают «A или B».
  • Символ ? ставится после символа (группы), который может как присутствовать, так и отсутствовать.
  • Символ * ставится после символа (группы), который может отсутствовать или присутствовать неограниченное число раз подряд.
  • Символ + действует аналогично символу * с той лишь разницей, что предшествующий ему символ обязательно должен присутствовать хотя бы один раз.
  • Квадратные скобки [] используются для перечисления допустимых символов.
  • Квадратные скобки [^] используются для перечисления недоступных символов.
  • Символ  ставится перед спецсимволами, если они нужны в своем первозданном виде.
  • Все, что расположено после символа ‘#’, считается комментарием.

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