Перейти на главную   
  helloworld.ru - документация и книги по программированию  
helloworld.ru - документация и книги по программированию
    главная     хостинг    
Поиск по сайту:  
Смотрите также
Языки программирования
C#
MS Visual C++
Borland C++
C++ Builder
Visual Basic
Quick Basic
Turbo Pascal
Delphi
JavaScript
Java
PHP
Perl
Assembler
AutoLisp
Fortran
Python
1C

Интернет-технологии
HTML
VRML
HTTP
CGI
FTP
Proxy
DNS
протоколы TCP/IP
Apache

Web-дизайн
HTML
Дизайн
VRML
PhotoShop
Cookie
CGI
SSI
CSS
ASP
PHP
Perl

Программирование игр
DirectDraw
DirectSound
Direct3D
OpenGL
3D-графика
Графика под DOS

Алгоритмы
Численные методы
Обработка данных

Сис. программирование
Драйверы

Базы данных
MySQL
SQL

Другое

Хостинг


Друзья
demaker.ru
Реклама

Лучший хостинг. Аренда серверов




helloworld.ru

3. Настройка

  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


[ Оглавление ]









helloworld.ru © 2001-2021
Все права защищены
Rambler's Top100