cwarez Postado Junho 28, 2009 Denunciar Share Postado Junho 28, 2009 (editado) galera, estou com uma dúvidao negocio é o seguinteeu chamo meus links desta maneiraindex.php?pagina=clistalista&categoria=Informaticadaí, tava lendo sobre url amigaveis, e eu consegui fazer com que lesse assimhttp://site.com.br/clicalista-informaticaqueria saber se tem como eu fazer aparecer assimhttp://site.com.br/clicalista/informaticaentendem?olhem o meu .htaccessRewriteEngine 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=$1só que não carrega o estilo da paginavlw pessoal, espero que vocês possam me ajudarmuito obrigadoe boa tarde ! Editado Junho 28, 2009 por cwarez Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Jonathan Queiroz Postado Junho 28, 2009 Denunciar Share Postado Junho 28, 2009 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"> Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 neto.joaobatista Postado Junho 29, 2009 Denunciar Share Postado Junho 29, 2009 eu chamo meus links desta maneiraindex.php?pagina=clistalista&categoria=Informaticaqueria saber se tem como eu fazer aparecer assimhttp://site.com.br/clicalista/informaticaBom, 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(); ?>[]'sJ. Neto Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Marcus Nunes Postado Junho 30, 2009 Denunciar Share Postado Junho 30, 2009 www.site.com/clicalista/informaticaRewriteRule ^([a-z0-9_-]+)/([a-z0-9_-]+)$ index.php?pagina=$1&categoria=$2 [L]Tenta aí :) Citar Link para o comentário Compartilhar em outros sites More sharing options...
Pergunta
cwarez
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
eu já tentei mudar a linha parasó que não carrega o estilo da pagina
vlw pessoal, espero que vocês possam me ajudar
muito obrigado
e boa tarde !
Editado por cwarezLink para o comentário
Compartilhar em outros sites
3 respostass a esta questão
Posts Recomendados
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.