Разрабатывая сайты веб программист неизбежно сталкивается с проблемами переноса своего чада на конечный хостинг. И чем быстрее, и безболезнен перенос тем больше времени и нервов у нас остается. И, правда, вы еще не сталкивались с ошибками, на хостинге, на которые тратили 3-4 часа? Не стоит…

Создание виртуального хоста

Я часто встречал веб программистов, которым лень разобраться с виртуальными хостами в апаче, мол работа кипит не до этого – в следующий раз. И новоиспеченный сайт создается в папочке /newsite/ главной директории апача с доступом http://localhost/newsite/. После этот программист тратит дополнительное время на перенос своего детища.

Создается вируальный хост всего за 3 минуты (если искать нужные файлы в тотале мышкой):

  1. Находим конфиг апача (httpd.conf) и вставляем туда такие строки
    1. <VirtualHost subway>
    2. ServerAdmin zipo@some_domain.com
    3. DocumentRoot c:/inetpub/ap2www/subway
    4. ServerName subway
    5. ErrorLog c:/Inetpub/apache/logs/subway_error.log
    6. CustomLog c:/Inetpub/apache/logs/subway.log common
    7. </VirtualHost>
    Обычно секция виртуальных хостов находится в самом низу конфига. Но в разных линуксячих сборках они могут быть вынесены в отдельные папки, что весьма удобно.
    Где subway и будет нашим виртуальным хостом.
    c:/inetpub/ap2www/subway – каталог для файлов нашего нового сайта.
  2. Находим файлик hosts, для пользователей windows (c:\WINDOWS\system32\drivers\etc\hosts), пользователи линукса для поиска пользуют locate, ибо этот файл может находится где угодно
    Вставляем туда:
    127.0.0.1 subway
  3. Перезапускаем apache и если пользуете IE, то его тоже.

Наш хост готов к использованию и откликается на http://subway/. Естественно это только для нашей машины, для большего идем на гугль.

Настройка окружения

Теперь нам нужно создать свое окружение и по максимуму изолироваться от внешних параметров хостинга. Делается это с помощью файлика .htaccess Все мои сайты работают со следующим содержанием .htaccess:
  1. php_value magic_quotes_gpc 1
  2. php_value register_globals 0
  3. php_value mbstring.func_overload 6
  4. php_value mbstring.internal_encoding UTF-8
  5. php_value mbstring.http_output pass
  6. php_value mbstring.http_input pass
  7. php_value mbstring.encoding_translation 0
  8.  
  9. RewriteEngine on
  10. RewriteCond %{REQUEST_FILENAME} !-d
  11. RewriteCond %{REQUEST_FILENAME} !-f
  12. RewriteRule .+ /index.php

php_value – инструкции по изменению параметров php, которые так же можно изменить в php.ini или функцией ini_set, правда не всегда это доступно.

Насильно отключаем register_globals, чего и вам искренне желаю, никогда не используйте эту порочность, ибо будут беды, причем много.

Делаем однообразное поведение с отбивкой слешами входящих данных (magic_quotes_gpc) - лучше включать. Ибо появление лишних слешей не так критично как SQL injection. В любом случае и то и другое – кривые руки или плохой сон, но никто от этого не застрахован и все мы ошибаемся. Дабы у Вас не возникало сомнений о том, почему я это тут пишу, вставлю сюда оригинальное решение супер монстров с моей прошлой работы:

  1. function MagicQuote($str) {
  2. if (!ini_get('magic_quotes_gpc'))
  3. $str = addslashes($str);
  4. return $str;
  5. }

Вот, и используем эту функцию каждый раз, когда хотим делать вставки в SQL

Кодировка

Т.к. сайты я разрабатывал не только для Украины и России то я столкнулся с проблемой кодировок. Хотя нет, вру, я с ней не сталкивался, я с ней заранее разобрался. Думаю, вы уже не раз встречались со словами «Используйте UTF-8, ибо она спасет мир» - используйте, мир она, конечно, не спасет, но от проблем избавит.

И так, зачем все это? Очень просто я не раз делал сайты с различными комбинациями языков, к примеру, знаете ли вы кодировки которые, используют немцы? А знать хотите? Я тоже нет, и меня эта проблема минула. Когда вы разрабатываете сайт на нескольких языках, к примеру, на русском и немецком не думайте, что cp1251 для немецкого это правильно. Вы просто погрязните в проблемах использования нескольких кодировок на сайте. Дабы не заморачиваться на смене кодировок, а тем более хранении этого дела в БД используйте UTF-8.

Последующие строки .htaccess связаны, конечно же, с использованием кодировки UTF-8. UTF-8 – мультибайтовая кодировка, где для хранения 1 символа требуется 2 байта. Естественно с этим связаны определенные проблемы. К примеру, strlen – будет выдавать неправильную длину строки. Дабы все это дело вернуть на места свои разработчики PHP сделали модуль mbstring, в котором функции работы со строчками корректно ведут себя с мультибайтовыми кодировками. Но проблема состоит в том, что все эти новые функции имеют название отличное от стандартных аналогов: strlen – mb_strlen. Когда я переходил на использование UTF-8 желания лазить и заменять везде название функций у меня, конечно же, не возникло. Весьма скоро выяснилось, что если изменить параметр mbstring.func_overload, то мультибайтовый аналог функций накроет своих собратьев, и все проблемы сразу исчезнут.

Если ставить mbstring.func_overload в 6, то перекрываются все функции кроме mail. С ней связаны определенные проблемы при отсылки писем содержащих несколько частей. Дальше вы можете настроить различные варианты автоматической конвертации исходящий и входящих данных. Но я данной функциональностью не пользуюсь, потому как авто определение кодировки весьма сомнительное дело. Поэтому я устанавливаю внутреннюю кодировку в UTF-8, т.к. все данные внутри скрипта в этой кодировке и все остальные параметры – как пришло так и получаем.

В большинстве случаев все данные будут к вам приходить в кодировке, которую вы указали в HTTP заголовках и мета тегов браузера, если там UTF-8, то и данные придут в этой кодировке. Не забудьте переключить ваш редактор на использование UTF-8. БД тоже должна понимать, что общаетесь вы с ней в кодировке UTF-8. Для MySQL это делается командой "set names utf8;", которую можно посылать сразу же после соединения с БД. Тогда и БД вам будет отвечать в кодировке UTF-8, что не может не радовать.

mod_rewrite

Осталось самое малое – указать правила переадресации. Если вы не знаете, что это такое, то поищите в Интернете, по словам ЧПУ и прочитайте мою статью «Человеку понятный УРЛ (ЧПУ) и кириллица». На удивление в Интернете появились даже сервисы, которые генерят RewriteCond в зависимости от параметров которые вы передаете через GET. Линки на эти сервисы я давать не буду, это глупость и применимо это разве, что в латании какого либо готового решения и то, я этого тоже не поддержу.

Надеюсь, дойдя до этого места, вы уже в какой-то мере осведомились с ЧПУ. И так для реализации нужно перенаправить запросы на несуществующие материалы на какой-то обработчик:

  1. RewriteEngine on
  2. RewriteCond %{REQUEST_FILENAME} !-d
  3. RewriteCond %{REQUEST_FILENAME} !-f
  4. RewriteRule .+ /index.php

Данные строки означают, что в случае если по запросу не обнаружен никакой файл или директория, то запрос перенаправляется в index.php.

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

  1. $_SERVER['REQUEST_URI']

Разложить эту строку на параметры:

  1. $_URL = explode('/', $_SERVER['REQUEST_URI']);

И дальше обрабатывать, как вам будет угодно.