rogernem 0 Denunciar post Postado Julho 13, 2009 Tenho um .htaccess: Options +FollowSymLinks RewriteEngine On RewriteRule ^home$ home.php [NC,L] RewriteRule ^produto/(.*)$ produto.php?id=$1 [NC,L] Quando digito www.site.com.br/home ele carrega a página certinho. Porém acessando www.site.com.br/produto/1 ele "perde" o caminho do css, imagens, etc. e a página fica toda quebrada. Como arrumo isso? Compartilhar este post Link para o post Compartilhar em outros sites
Matias Rezende 50 Denunciar post Postado Julho 13, 2009 Caminho absoluto. Carlos Eduardo Compartilhar este post Link para o post Compartilhar em outros sites
Rafael Wapbrasil 1 Denunciar post Postado Julho 13, 2009 O browser considera 'produto' como um diretorio de arquivos. Assim ele tenta abrir os arquivos desta pasta e como a pasta nao existe nao vai abrir. Ai você tem que fazer como o mathias disse, por o caminho completo dos arquivos (com http://) Compartilhar este post Link para o post Compartilhar em outros sites
rogernem 0 Denunciar post Postado Julho 13, 2009 "Caminho absoluto. Carlos Eduardo" Como faz?! "O browser considera 'produto' como um diretorio de arquivos. Assim ele tenta abrir os arquivos desta pasta e como a pasta nao existe nao vai abrir. Ai você tem que fazer como o mathias disse, por o caminho completo dos arquivos (com http://) " Eu ja tentei assim e acontece a mesma coisa. Nao funciona. Nao teria como no proprio htaccess informar isso? O caminho certo para acessar, sei lá.. Compartilhar este post Link para o post Compartilhar em outros sites
Rafael Wapbrasil 1 Denunciar post Postado Julho 13, 2009 Exemplo: você tem no produto.php em uma certa parte: <img src="imagem.gif" />, você trocaria para <img src="http://site.com/imagem.gif" /> <a href="index.php">, você trocaria para <a href="http://site.com/index.php"> Compartilhar este post Link para o post Compartilhar em outros sites
rogernem 0 Denunciar post Postado Julho 14, 2009 Exemplo: você tem no produto.php em uma certa parte: <img src="imagem.gif" />, você trocaria para <img src="http://site.com/imagem.gif" /> <a href="index.php">, você trocaria para <a href="http://site.com/index.php"> Eu tentei assim e nao rolou e eu queria saber como fazer isso no htaccess. Voce sabe? Compartilhar este post Link para o post Compartilhar em outros sites
João Batista Neto 448 Denunciar post Postado Julho 14, 2009 Exemplo: você tem no produto.php em uma certa parte: <img src="imagem.gif" />, você trocaria para <img src="http://site.com/imagem.gif" /> <a href="index.php">, você trocaria para <a href="http://site.com/index.php"> Eu tentei assim e nao rolou e eu queria saber como fazer isso no htaccess. Voce sabe? Amigo, propus isso em um outro fórum, de uma olhada: 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/uma_pagina e seu index.php receberá: var_dump( $_GET[ "pagina" ] ); //string 'uma_pagina' (length=10) Ex 2 - http://www.seudominio.com.br/uma_pagina/categoria e seu index.php receberá: var_dump( $_GET[ "pagina" ] ); //string 'uma_pagina' (length=10) var_dump( $_GET[ "categoria" ] ); //string 'categoria' (length=9) Ex 3 - http://www.seudominio.com.br/uma_pagina/ca.../arg1/arg2/arg3 e seu index.php receberá: var_dump( $_GET[ "pagina" ] ); //string 'uma_pagina' (length=10) var_dump( $_GET[ "categoria" ] ); //string 'categoria' (length=9) var_dump( $_GET[ "argv" ] ); //array 0 => string 'arg1' (length=4) 1 => string 'arg2' (length=4) 2 => string 'arg3' (length=4) var_dump( $_GET[ "argc" ] ); //int 3 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. <?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(); ?> Compartilhar este post Link para o post Compartilhar em outros sites