Ir para conteúdo
Fórum Script Brasil
  • 0

RewriteRule dúvidas


cwarez

Pergunta

galera, estou com uma dúvida

o negocio é o seguinte

eu chamo meus links desta maneira

index.php?pagina=clistalista&categoria=Informatica

daí, tava lendo sobre url amigaveis, e eu consegui fazer com que lesse assim

http://site.com.br/clicalista-informatica

queria saber se tem como eu fazer aparecer assim

http://site.com.br/clicalista/informatica

entendem?

olhem o meu .htaccess

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule clicalista-(.*)\/?$  /index.php?pagina=clicalista&categoria=$1
eu já tentei mudar a linha para
RewriteRule clicalista/(.*)\/?$  /index.php?pagina=clicalista&categoria=$1

só que não carrega o estilo da pagina

vlw pessoal, espero que vocês possam me ajudar

muito obrigado

e boa tarde !

Editado por cwarez
Link para o comentário
Compartilhar em outros sites

3 respostass a esta questão

Posts Recomendados

  • 0

Isso ocorre devido ao fato de que o navegador não sabe que as urls foram reescritas, tudo isso ocorre no servidor.

Sendo assim, o navegador vai imaginar que o arquivo .css do site está na mesma pasta (que não é a pasta "real")

Recomendo que sempre referencie arquivos externos de forma absoluta (você pode fazer isso com um "/" na frente do caminho)

<link rel="stylesheet" type="text/css' href="/pasta_onde_esta_o_estilo/estilo.css">

Link para o comentário
Compartilhar em outros sites

  • 0
eu chamo meus links desta maneira

index.php?pagina=clistalista&categoria=Informatica

queria saber se tem como eu fazer aparecer assim

http://site.com.br/clicalista/informatica

Bom, eu tenho feito o seguinte em todos os meus projetos:

No meu .htaccess eu não preocupo em separar as partes que preciso, em vez disso jogo tudo em uma variável chamada querystring:

RewriteEngine on
RewriteBase /

RewriteRule ^(.*)$ Gateway.php?querystring=/$0 [QSA]

php_value auto_append_file index.php
Esse .htacces fará com que qualquer coisa enviada via URL seja colocada dentro da variável querystring e esse conteúdo seja passado para um arquivo chamado Gateway. É no Gateway.php, que contém a classe Gateway que trato a querystring e faço os desvios necessários, quando necessário. Para que esse post não fique muito maior que já vai ficar eu preferi não montar a classe Gateway completa (a que eu uso atualmente tem mais de 1000 linhas), em vez disso eu estou enviando apenas a possibilidade de resgatar folhas de estilo e scripts javascript. O que vai acontecer é o seguinte, o usuário digita no navegador: Ex 1 - http://www.seudominio.com.br/clicalista e seu index.php receberá:
var_dump( $_GET[ "pagina" ] ); //string 'clicalista' (length=10)
Ex 2 - http://www.seudominio.com.br/clicalista/informatica e seu index.php receberá:
var_dump( $_GET[ "pagina" ] ); //string 'clicalista' (length=10)
var_dump( $_GET[ "categoria" ] ); //string 'informatica' (length=11)
Ex 3 - http://www.seudominio.com.br/clicalista/in.../arg1/arg2/arg3 e seu index.php receberá:
var_dump( $_GET[ "pagina" ] ); //string 'clicalista' (length=10)
var_dump( $_GET[ "categoria" ] ); //string 'informatica' (length=11)
var_dump( $_GET[ "argv" ] ); //array
      0 => string 'arg1' (length=4)
      1 => string 'arg2' (length=4)
var_dump( $_GET[ "argc" ] ); //int 2
Ou seja, o primeiro argumento é sempre a página, o segundo é a categoria e os demais são passados para o index.php como uma matriz. Porém existe uma exceção, quando o primeiro argumento é o nome de um método da classe Gateway então o método é chamado recebendo todos os argumentos passados pela URL e a execução da aplicação "morre" na própria classe Gateway, não indo para o index.php. Ex 4 - http://www.seudominio.com.br/styles/arq1.c...q2.css/arq3.css Isso fará com que todos os arquivos: arq1.css, arq2.css, arq3.css, ..., arqn.css sejam lidos de uma vez só e enviados para o navegador. A vantagem desse método é que evitamos várias requisições ao servidor (chamamos todos os arquivos necessários de uma vez só). Nessa requisição styles é o nome de um método da classe Gateway, abaixo um exemplo utilizando o método scripts da classe Gateway: Ex 5 - http://www.seudominio.com.br/scripts/arq1.js/arq2.js/arq3.js Como no primeiro caso, os arquivos arq1.js, arq2.js, arq3.js, ..., arqN.js serão carregados. Como disse anteriormente, eu não implementei toda a classe para não deixar o post muito grande. Apenas os métodos Gateway::styles e Gateway::scripts foram implementados, porém você pode implementar quantos métodos quiser, inclusive um outro que você provavelmente irá utilizar que é o Gateway::images que irá carregar suas imagens. Espero que o código abaixo o ajude, ele deverá ficar junto com o seu .htaccess na raiz do seu projeto:
<?php
    /**
     * Interpreta a querystring e distribui as requisições
     */
    abstract class Gateway {
        /**
         * Pasta de imagens relativa a localização do Gateway
         */
        const FOLDER_IMG    = "images";

        /**
         * Pasta de scripts relativa a localização do Gateway
         */
        const FOLDER_JS        = "js";

        /**
         * Pasta de estilos relativa a localização do Gateway
         */
        const FOLDER_CSS    = "css";

        /**
         * Pasta onde o Gateway está localizado
         * @var string
         */
        static public $document_root;

        /**
         * Iniciamos o gateway, que irá interpretar a querystring, separar os componentes e distribuir as requisições
         * conforme necessário.
         */
        static public function start(){
            $argv = array();

            self::$document_root = getcwd();

            /**
             * Definindo as regras de localização, dinheiro, data e outros para português do Brasil
             */
            setlocale( LC_ALL , 'pt_br' );
            date_default_timezone_set( "America/Sao_Paulo" );

            /**
             * Verificamos a existência de algum argumento passado na querystring
             */
            if ( isset( $_REQUEST[ "querystring" ] ) ){
                if ( !empty( $_REQUEST[ "querystring" ] ) ){
                    $mtc = array();

                    if ( preg_match_all( "/((?:\\/)([^\\/]*))/" , $_REQUEST[ "querystring" ] , $mtc ) ){
                        $argv = $mtc[ 2 ];
                    }
                }

                unset( $_REQUEST[ "querystring" ] );
            }

            /**
             * Verificamos se o primeiro argumento passado é um método existente em Gateway, se for então chamamos
             * o método passando o restante da matriz de argumentos como parâmetro e então interrompemos a execução
             * da aplicação.
             */
            if ( isset( $argv[ 0 ] ) && method_exists( "Gateway" , $argv[ 0 ] ) ){
                $method = array_shift( $argv );

                /**
                 * Iniciamos a saída buferizada
                 */
                ob_start();

                /**
                 * Aqui tentamos chamar o método de Gateway requerido, é importante que qualquer método chamado aqui
                 * retorne TRUE se a requisição for bem sucedida, se for retornado qualquer coisa diferente de TRUE
                 * então um HTTP 400 será enviado para o browser.
                 */
                try {
                    $ret = call_user_func_array( array( "Gateway" , $method ) , array( count( $argv ) , $argv ) );

                    if ( ( gettype( $ret ) != "boolean" ) || !$ret ){
                        header( "HTTP/1.1 400 Bad Request" );
                        ob_clean();
                    } else {
                        /**
                         * Enviamos o conteúdo da chamada para o browser
                         */
                        ob_end_flush();
                    }
                } catch ( Exception $e ){
                    header( "HTTP/1.1 502 Bad Gateway" );
                    ob_clean();
                }

                die;
            } else {
                /**
                 * Verificamos se existe uma página definida
                 */
                if ( count( $argv ) ){
                    $pagina = array_shift( $argv );

                    /**
                     * Esse loop é para garantir que o usuário não utilize um // para nos confundir
                     */
                    while ( !strlen( $pagina ) && count( $argv ) ) $pagina = array_shift( $argv );

                    if ( !empty( $pagina ) ) $_REQUEST[ "pagina" ] = $_GET[ "pagina" ] = $pagina;
                }

                /**
                 * Verificamos se existe uma categoria definida
                 */
                if ( count( $argv ) ){
                    $categoria = array_shift( $argv );

                    /**
                     * Esse loop é para garantir que o usuário não utilize um // para nos confundir
                     */
                    while ( !strlen( $categoria) && count( $argv ) ) $categoria = array_shift( $argv );

                    if ( !empty( $categoria ) ) $_REQUEST[ "categoria" ] = $_GET[ "categoria" ] = $categoria;
                }

                /**
                 * Se sobrou algum item na nossa matriz de argumentos então passamos para as variáveis globais
                 * $_GET e $_REQUEST
                 */
                if ( count( $argv ) ){
                    $_REQUEST[ "argv" ] = $_GET[ "argv" ] = $argv;
                    $_REQUEST[ "argc" ] = $_GET[ "argc" ] = count( $argv );
                }
            }
        }

        /**
         * Recupera o conteúdo de um ou mais arquivos
         *
         * @param integer $argc Número de itens na matriz de arquivos
         * @param array $argv Matriz conténdo os arquivos
         * @param string $base_dir A pasta onde serão procurados os arquivos
         * @param integer $mtime Receberá a maior data de modificação dos arquivos da lista
         * @param string $content Receberá o conteúdo da lista de arquivos
         * @return boolean TRUE se tudo correr bem
         */
        static private function getFilesContent( $argc , $argv , $base_dir , &$mtime , &$content ){
            $ret        = true;
            $mtime        = 0;
            $content    = "";

            /**
             * Percorremos a matriz $argv e verificamos a existência de cada um dos arquivos solicitados.
             * Se apenas um arquivo da lista não existir, todo o processo é abortado e um Bad Request é
             * devolvido ao usuário.
             */
            for ( $i = 0; $i < $argc; $i++ ){
                $name = basename( $argv[ $i ] );

                /**
                 * Verificamos se o arquivo existe
                 */
                if ( file_exists( ( $file = sprintf( "%s/%s" , $base_dir , $name ) ) ) ){
                    /**
                     * Abrimos o arquivo para podermos lê-lo
                     */
                    $fh = fopen( $file , "r" );

                    /**
                     * Verificamos a data de modificação do arquivo
                     */
                    if ( ( $tempmtime = filemtime( $file ) ) > $mtime )
                        $mtime = $tempmtime;

                    /**
                     * Se já tivermos algum conteúdo então adicionamos uma quebra de linha para evitar
                     * que o conteúdo de um arquivo comece sobre o fim do arquivo anterior
                     */
                    if ( !empty( $content ) )
                        $content .= "\r\n";

                    /**
                     * Pegamos o conteúdo do arquivo atual
                     */
                    while ( ( $part = fread( $fh , 32767 ) ) )
                        $content .= $part;

                    /**
                     * Fechamos o arquivo
                     */
                    fclose( $fh );
                } else {
                    /**
                     * O arquivo solicitado não existe, abortamos a processo
                     */
                    $ret = false;
                    break;
                }
            }

            return( $ret );
        }

        /**
         * Devolve as folhas de estilo que o usuário requisitou
         *
         * @param integer $argc O total de folhas de estilo requisitadas
         * @param array $argv Matriz contento o nome do arquivo de cada folha de estilo
         * @return boolean TRUE se for possível carregar as folhas de estilo requisitadas
         */
        static private function Styles( $argc , $argv ){
            $css_folder    = sprintf( "%s/%s" , self::$document_root , self::FOLDER_CSS );
            $content    = "";
            $mtime        = 0;
            $ret        = self::getFilesContent( $argc , $argv , $css_folder , $mtime , $content );

            /**
             * Verificamos se tudo correu bem
             */
            if ( $ret ){

                /**
                 * Ok, tudo correu bem.
                 * Verificamos se temos algum conteúdo, se tivermos então montamos os cabeçalhos e enviamos
                 * o conteúdo para o usuário com um HTTP 200.
                 * Se não tivermos nenhum conteúdo então enviamos apenas um HTTP 204.
                 */
                if ( ( $content_length = strlen( $content ) ) ){
                    header( "HTTP/1.1 200 Ok" );
                    header( sprintf( "Date: %s" , gmstrftime( "%a, %d %b %Y %H:%M:%S %Z" , time() ) ) );
                    header( "Content-Type: text/css" );
                    header( sprintf( "Content-Length: %d" , $content_length ) );
                    header( "Expires: Wed 1 Dec 2010 00:00:00 GMT" );
                    header( sprintf( "Last-Modified: %s" , gmstrftime( "%a, %d %b %Y %H:%M:%S %Z" , $mtime ) ) );
                    header( "Etag: " );
                    header( "Connection: Close" );

                    /**
                     * Enviamos o conteúdo para o usuário
                     */
                    print( $content );
                } else {
                    header( "HTTP/1.1 204 No Content" );
                }
            }

            return( $ret );
        }

        /**
         * Devolve os scripts que o usuário requisitou
         *
         * @param integer $argc O total de scripts requisitados
         * @param array $argv Matriz contento o nome do arquivo de cada script
         * @return boolean TRUE se for possível carregar os scripts requisitados
         */
        static private function Scripts( $argc , $argv ){
            $js_folder    = sprintf( "%s/%s" , self::$document_root , self::FOLDER_JS );
            $content    = "";
            $mtime        = 0;
            $ret        = self::getFilesContent( $argc , $argv , $js_folder , $mtime , $content );

            /**
             * Verificamos se tudo correu bem
             */
            if ( $ret ){

                /**
                 * Ok, tudo correu bem.
                 * Verificamos se temos algum conteúdo, se tivermos então montamos os cabeçalhos e enviamos
                 * o conteúdo para o usuário com um HTTP 200.
                 * Se não tivermos nenhum conteúdo então enviamos apenas um HTTP 204.
                 */
                if ( ( $content_length = strlen( $content ) ) ){
                    header( "HTTP/1.1 200 Ok" );
                    header( sprintf( "Date: %s" , gmstrftime( "%a, %d %b %Y %H:%M:%S %Z" , time() ) ) );
                    header( "Content-Type: text/javascript" );
                    header( sprintf( "Content-Length: %d" , $content_length ) );
                    header( "Expires: Wed 1 Dec 2010 00:00:00 GMT" );
                    header( sprintf( "Last-Modified: %s" , gmstrftime( "%a, %d %b %Y %H:%M:%S %Z" , $mtime ) ) );
                    header( "Etag: " );
                    header( "Connection: Close" );

                    /**
                     * Enviamos o conteúdo para o usuário
                     */
                    print( $content );
                } else {
                    header( "HTTP/1.1 204 No Content" );
                }
            }

            return( $ret );
        }
    }

    Gateway::start();
?>

[]'s

J. Neto

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,2k
    • Posts
      652k
×
×
  • Criar Novo...