Большой архив статей, книг, документации по программированию, вебдизайну, компьютерной графике, сетям, операционным системам и многому другому
 
<Добавить в Избранное>    <Сделать стартовой>    <Реклама на сайте>    <Контакты>
  Главная Документация Программы Обои   Экспорт RSS E-Books
 
 

   Интернет технологии -> PHP -> FAQ конференции RU.PHP


RU.PHP FAQ. Настройка

  1. Каким образом создать ссылку, типа как у http://lenta.ru/2002/01/09/?
  2. Я делаю так, как написано в примерах, но переменные, передаваемые в скрипт, не видны. Почему?
  3. Зачем теперь register_globals=off?
  4. У моего хостера стоит register_globals=off, как можно включить register_globals программно?


  1.  Каким образом создать ссылку, типа как у http://lenta.ru/2002/01/09/?
    У ленты этот движок основан на mod_rewrite, имнсхо, поскольку там апач стоит

    www.lenta.ru

    HTTP/1.1 200 OK
    Date: Fri, 11 Jan 2002 14:45:37 GMT
    Server: Apache/1.3.14 (Unix) rus/PL30.0

    соответственный rewrite rule регекспом - и все ок. а в директории хтмл'ки складывать - черезчур корявый изврат. 8)

    вот пример, как организовать подобное:

    мы хотим выводить новости из базы данных по запрошенному ури
    w3.lenta.ru/2002/01/11/tv6/ имея таблицу с полями новостей anchor VARCHAR(255), date date, announce VARCHAR(255), body TEXT; где anchor - текстовый указатель, date - дата, announce - анонс новости, body - тело новости.

    делаем виртуальный хост
    --- [ httpd.conf ] ---
    LoadModule rewrite_module modules/mod_rewrite.so

    <VirtualHost 192.168.10.1>
        ServerName w3.lenta.ru
        DocumentRoot "/wwwroot/htdocs/w3lenta"

        RewriteEngine On
        RewriteLogLevel 2

        RewriteCond %{REQUEST_URI} !/index\.php
        RewriteRule ^/([0-9][0-9][0-9][0-9]+)/([0-9][0-9]+)/([0-9][0-9]+)/(.*)/$
        /news.php?anchor=$4&date=$1-$2-$3 [T=application/x-httpd-php,L]

        ErrorLog logs/w3lenta-error.log
        CustomLog logs/w3lenta-access.log common

        <Directory /wwwroot/htdocs/w3lenta>
            Options +Includes -Indexes
        </Directory>
    </VirtualHost>
    --- [ httpd.conf ] ---

    сразу привожу извинения за длинный регексп - пхп/перловый
    ^/(\d{4}+)/(\d{2}+)/(\d{2}+)/(.*)/$ не прокатил. видимо модифер \d rewrite engine не понимает - у него там какие-то свои правила паттернов.

    прописываем w3.lenta.ru в hosts на ip 192.168.10.1 (ip по вкусу - у кого как отстроен локальный айпишник)
    создаем два файла в корне /wwwroot/htdocs/w3lenta/:

    1. этот будет отвечать на запрос w3.lenta.ru и в нем, допустим, строится листинг по таблице из 10-ти последних новостей, но мы сюда забьем тестируемый урл.
    --- [ index.php ] ---
    <a href="/2002/01/11/tv6/">ТВ-6 распадается</a>
    --- [ index.php ] ---

    2. этот будет выводить новость по date и anchor. кода не прописано, но сделать select announce, body, date from table where date=$date AND anchor=$anchor из таблицы новостей, я думаю, трудности никому не составит. 8)

    --- [ news.php ] ---
    <?
    echo 'данные запрошенной новости: anchor = '.$anchor.', date = '.$date.'
    '
    ;
    echo 
    'REQUEST_URI: http://'.getenv("HTTP_HOST").getenv("REQUEST_URI");
    ?>

    --- [ news.php ] ---

    набираем в ослике w3.lenta.ru, щелкаем линк, и наслаждаемся результатом 8)

    данные запрошенной новости: anchor = tv6, date = 2002-01-11
    REQUEST_URI: http://w3.lenta.ru/2002/01/11/tv6/

    remarks: в реале можно сделать, если админ конфиг пропишет или ты сам админ. 8)
    некоторые феньки rewrit'а (не могу сказать точно какие) работают только в версии апача выше 1.2 - я тестировал на 1.3.20. категорию прикрутить тоже несложно - просто соответствующих категориям регекспов налепить, убрав modifier L (last rule) из всех окромя последнего.
    Vladimir N. Zaytcev <2:5015/116>

  2.  Я делаю так, как написано в примерах, но переменные, передаваемые в скрипт, не видны. Почему?
    Hачиная с PHP версии 4.1 установка register_globals по умолчанию установлена в Off. Это означает, что к переменным переданным извне, например так http://some.server.dom/script.php?varname=value, при такой настройке в скрипте нельзя обращаться напрямую по имени $varname. Вместо этого надо использовать обращение к элементам специально предопределенных следующих массивов:
    $_GET, $_POST, $_COOKIE, $_SESSION, $_SERVER (в PHP версии от 4.1) или, соответственно, $HTTP_GET_VARS, $HTTP_POST_VARS, $HTTP_COOKIE_VARS, $HTTP_SERVER_VARS (в любых версиях PHP).
    При этом обращение к переменной приведенной в примере выше будет выглядеть так:
    $_GET['varname'] или $HTTP_GET_VARS['varname']
    Serge V. Tarasov

  3.  Зачем теперь register_globals=off?
    Это сделано для облегчения написания безопасных скриптов. При разработке достаточно сложных проектов, когда число используемых переменных велико, очень легко можно допустить использование неинициализированной переменной, которая при register_globals=On может быть передана скрипту извне злобным хацкером. Поэтому, для написания хороших скриптов, рекомендуется обращаться к входным переменным через предопределенные массивы (при этом программист, заранее зная, что эти переменные переданы снаружи производит соответствующие проверки на корректность) и включить error_reporting = E_ALL (по крайней мере, на этапе написания и тестирования скрипта) для того, чтобы PHP предупреждал о использовании неинициализированных переменных.
    Безусловно, возможно написание хороших и безопасных скриптов и при register_globals=On, но:
    - это требует значительно более внимательного подхода к написанию;
    - эти скрипты не будут корректно работать на хостинге, где register_globals=Off (в отличие от скриптов, написанных для
    register_globals=Off, которые будут корректно работать везде);
    ВНИМАНИЕ!
    - возможно, что из будущих версий PHP register_globals будет исключен вообще.
    Serge V. Tarasov

  4.  У моего хостера стоит register_globals=off, как можно включить register_globals программно?
    Так как, вероятно, в следующих версиях register_globals уберут совсем и поведение PHP будет таким, как при register_globals=off, то рассмотрим этот вопрос под другим углом.
    Поскольку существует множество уже используемых скриптов (надежных и не очень), которые написаны в расчете на register_globals=On, то добавлением нескольких строк кода заставим скрипт работать.
    В общем случае, надо из предопределенных массивов $_GET, $_POST, $_COOKIE, $_SESSION, $_SERVER (или какие вам нужны) импортировать значения в переменные с именами элементов. Hапример так (для переменных получаемых по GET):
    <?
      
    while (list($name$value)=each($HTTP_GET_VARS)) {
        if(isset($
    $name)) continue;
        $
    $name=$value;
      }
    ?>

    или, лучше так:
    <?
      extract
    ($HTTP_GET_VARS);
      
    extract($HTTP_POST_VARS);
      
    extract($HTTP_COOKIE_VARS);
      
    extract($HTTP_SESSION_VARS);
      
    extract($HTTP_SERVER_VARS);
    ?>

    Естественно, это негативно сказывается на безопасности, поскольку после выполнения такого кода у вас станут глобальными все переменные переданные снаружи (нужные и ненужные), т.е. это все равно, что сделать register_globals=On.
    Serge V. Tarasov

Оглавление FAQ

 

 
Интересное в сети
 
10 новых программ
CodeLobster PHP Edition 3.7.2
WinToFlash 0.7.0008
Free Video to Flash Converter 4.7.24
Total Commander v7.55
aTunes 2.0.1
Process Explorer v12.04
Backup42 v3.0
Predator 2.0.1
FastStone Image Viewer 4.1
Process Lasso 3.70.4
FastStone Image Viewer 4.0
Xion Audio Player 1.0.125
Notepad GNU v.2.2.8.7.7
K-Lite Codec Pack 5.3.0 Full


Наши сервисы
Рассылка новостей. Подпишитесь на рассылку сейчас и вы всегда будете в курсе последних событий в мире информационных технологий.
Новостные информеры. Поставьте наши информеры к себе и у вас на сайте появится дополнительный постоянно обновляемый раздел.
Добавление статей. Если вы являетесь автором статьи или обзора на тему ИТ присылайте материал нам, мы с удовольствием опубликуем его у себя на сайте.
Реклама на сайте. Размещая рекламу у нас, вы получите новых посетителей, которые могут стать вашими клиентами.
 
Это интересно
 

Copyright © CompDoc.Ru
При цитировании и перепечатке ссылка на www.compdoc.ru обязательна. Карта сайта.