Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

rogernem

RewriteEngine On

Recommended Posts

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

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

"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

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

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.