Ir para o conteúdo

Classe .htaccess

Esta classe permite emular a reescrita de URLs em servidores sem suporte de mod_rewrite.

htaccess.class.php

<?php
/*
#    This program is free software; you can redistribute it and/or
#    modify it under the terms of the GNU General Public License
#    as published by the Free Software Foundation; either version 2
#    of the License, or (at your option) any later version.
#
#    This program is distributed in the hope that it will be useful,
#    but WITHOUT ANY WARRANTY; without even the implied warranty of
#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#    GNU General Public License for more details.
#    http://www.gnu.org/licenses/gpl.txt
#
*/

 /******
 *
 * class HTAccess - class for emulation .htaccess of Apache (module mod rewrite)
 * 
 * @author  Vladimir S. Bredihin
 * @access  public
 * @version 1.0
 * @package htaccess_emulation
 * @link    http://mycms.info
 *
 ******/

class HTAccess {
    var $parent;
    var $RewriteBase;
    var $htaccess;
    var $result;

    function HTAccess(&$result)
    {
        if (isset ($result))
            $this->result = &$result;
    }

    function execute ($vdir, $type='lines')
    {
        global $_SERVER;
        if (!$this->RewriteBase) $this->RewriteBase = $_SERVER['REDIRECT_URL'];
        if ($type == 'lines')
        {
            if ($htaccess = $this->_parse($type))
            {
                $vdirTmp = preg_replace("'^{$this->RewriteBase}[/]{0,1}'", '', $vdir);
                reset ($htaccess);
                foreach ($htaccess as $line)
                {
                    if ($line['switch'] == 'RewriteBase')
                    {
                        $this->RewriteBase = preg_replace(array('|^/|', '|/$|'), null, $line['regex']);
                        $vdirTmp = preg_replace("|^{$this->RewriteBase}[/]{0,1}|", '', $vdir);
                    }
                    elseif (ereg("{$line['regex']}", $vdirTmp))
                    {
                        $setVar = preg_replace("'{$line['regex']}'", $line['action'], $vdirTmp);
                        $line['action'] = preg_replace ("'^([^?]*)|'", '', $setVar);
                        switch ($line['switch'])
                        {
                            case 'RewriteRule': $vdir = $this->_RewriteRule($line['action']);
                            break;
                        }
                        break;
                    }
                }
            }
        }
        elseif ($type=='block')
        {
        $this->executeBlock ($vdir);
        }       
    }

    function executeBlock ($vdir)
    {
        /**/
    }
    function _parse ($type)
    {
        if ($type == 'lines')
        {            
            reset ($this->htaccess[$type]);
            foreach ($this->htaccess[$type] as $line)
            {
                preg_match("'^[ ]*([^ ]+)[ ]+([^ ]+)[ ]*([^ ]*)[ ]*([^ ]*)$'", $line, $parseLine);
                $result[] = array ('switch' => $parseLine[1], 'regex'=>$parseLine[2], 
                                   'action' => $parseLine[3], 'parms'=>$parseLine[4]);
            }
        }

        return $result;
    }
    function _RewriteRule($action)
    {
        preg_match("'^([^?]*)[?]{0,1}(.*)$'", $action, $url);
        $vdir = $this->_vdirMove ($url[1]);
        $this->_setResult ($url[2]);
        return $vdir;       
    }
    function _vdirMove($moveto)
    {
        $result = null;
        if ($moveto)
        {
            $vdir = split('/', $this->RewriteBase);
            $move = split('/', $moveto);
            foreach ($move as $step)
            {
                switch ($step)
                {
                    case '.':break;
                    case '..':unset ($vdir[end($vdir)]);break;
                    default: $vdir [] = $step;
                }
            }
            $result=implode ('/', $vdir);
        }
        return $result;
    }
    function _setResult ($get)
    {
        if ($get)
        {
            $get = split ('&', $get);
            foreach ($get as $value)
            {
                $var = split ('=', $value, 2);
                $this->result[$var[0]] = $var[1];
            }
        }
    }
    function setLine($line)
    {
        $this->htaccess ['lines'][] = $line;
    }
    function setBlock($htaccess)
    {
        $this->htaccess ['block'] = $htaccess;
    }
}
?>

Utilização

Um exemplo ilustrativo do uso desta classe:

include 'includes/htaccess.class.php';
include 'backoffice/includes/inc_cn.php';

$qs = $_SERVER['QUERY_STRING'] ? $_SERVER['QUERY_STRING'] : $_SERVER['REQUEST_URI'];

$htaccess = new HTAccess ($_GET);

$htaccess->setLine ('RewriteBase /');
$htaccess->setLine ('RewriteRule ^(.*)/(.*)-([0-9]+)/(.*)-([0-9]+).html$ ?idioma=$1&action=$2&pid=$3&id=$5 [L]');
$htaccess->setLine ('RewriteRule ^(.*)/(.*)-([0-9]+)/([0-9]+)/$ ?idioma=$1&action=$2&pid=$3&p=$4 [L]');
$htaccess->setLine ('RewriteRule ^(.*)/(.*)-([0-9]+)/$ ?idioma=$1&action=$2&pid=$3&p=1 [L]');
$htaccess->setLine ('RewriteRule ^(.*)/(.*)-([0-9]+)/$ ?idioma=$1&action=$2&pid=$3 [L]');
$htaccess->setLine ('RewriteRule ^(.*)/$ ?idioma=$1 [L]');

$htaccess->execute ($qs);

if( !$db->GetOne('SELECT activo FROM t_idiomas WHERE sigla=?',$_GET['idioma']) ){
    header('location:/pt/');
    exit();
}

if($_GET['pid']||$_GET['idioma'])   header('HTTP/1.0 200 OK');

switch ($_GET['pid']){

    case 1:
        include 'empresa/index.php';
    break;

    case 2:
        include 'servicos/index.php';
    break;

    case 3:
        if($_GET['id'])
            include 'portfolio/integral.php';
        else
            include 'portfolio/index.php';
    break;

    case 4:
        if($_GET['id'])
            include 'obras-em-curso/integral.php';
        else
            include 'obras-em-curso/index.php';
    break;

    case 5:
        include 'clientes/index.php';
    break;

    case 6:
        include 'contactos/index.php';
    break;

    default:
        include 'index.php';
    break;
}