Ir para conteúdo

POWERED BY:

Arquivado

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

Jhonei

.htaccess para query string com url dinâmica

Recommended Posts

Gostaria de saber onde está o erro, porque a url não está ficando amigável, ou seja, omitindo os diretórios e incluindo as barras...

 

Código php Query String:

<?php
$pagina = isset($_GET['pagina']) ? strip_tags(trim($_GET['pagina'])) : '';
$conteudo = isset($_GET['conteudo']) ? strip_tags(trim($_GET['conteudo'])) : '';

if ($pagina == "$pagina" && !$conteudo) {
$Pg = 'arquivos/'.$pagina.'.php';
}

elseif ($pagina == "$pagina" && $conteudo == "$conteudo") {
$SubPg = 'cds/'.$conteudo.'.php';
}
?>

 

 

.htaccess:

Options +FollowSymLinks
RewriteEngine on
RewriteCondRewriteRule !\.(css|jpg|jpeg|gif|png|swf|js)$ script.php
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)\/?(.*)\/?$ index.php?pagina=$1&conteudo=$2

 

 

Grato desde já, pela ajuda!!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Realizou as alterações no httpd.conf? Verifique-as.

 

Verifique esta expressão regular:

^(.*)\/?(.*)\/?$

Ela está muito gulosa, seja mais específico ou terá problemas.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Verifique esta expressão regular:

^(.*)\/?(.*)\/?$

Ela está muito gulosa, seja mais específico ou terá problemas.

 

 

 

Caro amigo "Gabriel Heming" eu já testei o meu query string com várias expressões htaccess, mas não obtive sucesso em nenhuma delas. Já utilizei até vários geradores de htacces para url dinâmica. mas como dito, sem sucesso. Por isso eu pus uma expressão abrangente contudo, continuo na mesma...

 

Acredito que o defeito esteja no código query string possa ser até a faita de um explode ou a falta de padronização no código.

 

$pagina = isset($_GET['pagina']) ?  explode('/', strip_tags(trim($_GET['pagina'])) : '';
$conteudo = isset($_GET['conteudo']) ?  explode('/', strip_tags(trim($_GET['conteudo'])) : '';

 

Esta colocação de "explode('/', strip_tags(trim($_GET" está correta???

Compartilhar este post


Link para o post
Compartilhar em outros sites

Em algum momento você consegui utilizar url dinâmica? Talvez não seja sua query string.

 

Leia esse tópico caso a sentença acima é verdadeira.

Não mostrar o caminho e o na url

 

Nesse artigo, há o básico para ativar url rewrite.

Compartilhar este post


Link para o post
Compartilhar em outros sites

O problema é que o meu query string possui seções e subseções, ou seja.

 

link's assim:

   exemplo.com/?pagina=home
  exemplo.com/?pagina=fotos
  exemplo.com/?pagina=videos

ETC...

 

 

E link's assim:

   exemplo.com/?pagina=home&conteudo=natureza
  exemplo.com/?pagina=home&conteudo=esports
  exemplo.com/?pagina=home&conteudo=noticias

ETC...

 

Não sei muito de htaccess mais acredito que a expressão "^(.*)\/?(.*)\/?$" deva estar entrando em conflito, por se tratar de duas seções de url's em um site.

 

Será eu eu tenho que fazer uma expressão para a seção e outra para a sub?

 

link do meu exemplo para mostrar como o site funciona: Clique aqui

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom, não entendo muito de url rewrite, mas até onde sei, os backreference (retrovisores) não podem ser dinâmicos.

 

Você terá que possuir uma regra para cada tipo, mas não utilize "." jamais, porque essa url noticia/detalhe vai casar com essa expressão:

 

^(.*)$

Assim, você aceita TUDO, inclusive barras.

 

Seja específico. Diga que aceita somente letras, números, ponto, desenhos, figuras, sons.... mas nunca tudo.

 

será melhor assim:

RewriteRule ^([\w]+)\/?$ index.php?pagina=$1
RewriteRule ^([\w]+)\/([\w]+)\/?$ index.php?pagina=$1&conteudo=$2

 

Este artigo é bem interessante para entender sobre o porque de não usar o . (ponto) em expressões regulares

Quantificadores gulosos

Compartilhar este post


Link para o post
Compartilhar em outros sites

Galera eu fiz tudo que me mandaram, mas estou ainda sem sucesso!!

 

Algem poderia me dar mais alguma ideia???

 

 

Abaixo estão os código atualizado para quem quiser analizar:

 

query_string.php

<?php
$pagina = isset($_GET['pagina']) ? $_GET['pagina'] : '';
$conteudo = isset($_GET['conteudo']) ? $_GET['conteudo'] : '';

if ($pagina == "$pagina" && !$conteudo) {
$Pg = 'arquivos/'.$pagina.'.php';
}

elseif ($pagina == "$pagina" && $conteudo == "$conteudo") {
$SubPg = 'conteudo/'.$conteudo.'.php';
}


switch ($pagina) {
	case 'home':
		$title = 'Home';
		$description = 'Página inicial do site de teste';
		$keywords = 'página inicial, site de teste, site, etc...';
	break;

	case 'perfil':
		$title = "Perfil";
		$description = "Página do perfil do site de teste";
		$keywords ="página dos perfil, perfil, perfil do site de teste";
	break;

	case 'fotos':
		$title = 'Fotos';
		$description = 'Página de fotos do site de teste';
		$keywords ='página de fotos, fotos, fotos do site de teste';
	break;

	case 'videos':
		$title = 'Vídeos';
		$description = 'Página de vídeos do site de teste';
		$keywords ='página de vídeos, vídeos, vídeos do site de teste';
	break;

	case 'faleconosco':
		$title = 'Fale Conosco';
		$description = 'Página de fale conosco do site de teste';
		$keywords ='página de fale conosco, fale conosco, fale conosco do site de teste';
	break;

	default:
		$title = 'Home';
		$description = 'Página inicial do site de teste';
		$keywords ='página inicial, site de teste, site, etc...';
	break;
}


switch ($conteudo) {
	case 'educacao':
		$title = 'Educação';
		$description = 'Página de educação do site de teste';
		$keywords ='página do educação, educação, educação do site de teste';
	break;

	case 'esporte':
		$title = 'Esporte';
		$description = 'Página de esporte do site de teste';
		$keywords ='página de esporte, esporte, esporte do site de teste';
	break;

	case 'cultura':
		$title = 'Cultura';
		$description = 'Página de cultura do site de teste';
		$keywords ='página de cultura, cultura, cultura do site de teste';
	break;

	case 'natureza':
		$title = 'Natureza';
		$description = 'Página de natureza do site de teste';
		$keywords ='página de natureza, natureza, natureza do site de teste';
	break;

	case 'religiao':
		$title = 'Religião';
		$description = 'Página de religião do site de teste';
		$keywords ='página de religião, religião, religião do site de teste';
	break;

	case 'politica':
		$title = 'Política';
		$description = 'Página de política do site de teste';
		$keywords ='página de política, política, política do site de teste';
	break;
}
?>

 

.htaccess

#Options +FollowSymLinks
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([\w]+)\/?$ ?pagina=$1
RewriteRule ^([\w]+)\/([\w]+)\/?$ ?pagina=$1&conteudo=$2

 

index.php

<?php include "query_string.php" ?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title><?php echo $title; ?></title>

<meta name="description" content="<?php echo $description; ?>" />
<meta name="keywords" content="<?php echo $keywords; ?>" />
</head>

<body>
<table width="100%" height="1050px" border="1" cellspacing="0" cellpadding="0">
 <tr>
   <th height="200px" colspan="5"><h1>Titulo</h1></th>
 </tr>


 <tr id="menu_horizontal" align="center" height="30px">
   <td><a href="?pagina=home">Home</a></td>
   <td><a href="?pagina=perfil">Perfil</a></td>
   <td><a href="?pagina=fotos">Fotos</a></td>
   <td><a href="?pagina=videos">Videos</a></td>
   <td><a href="?pagina=faleconosco">Fale Conosco</a></td>
 </tr>
 <tr>


      <td id="loader_menu_horizontal" height="800px" align="center" colspan="5">
<?php
if( (isset($Pg)) and (file_exists($Pg)) ) {
include($Pg);
} else {
include ("arquivos/home.php");
}
?>
      </td>


 </tr>
 <tr>
   <td height="20px" colspan="5" align="center">Roda pé</td>
 </tr>
</table>
</body>
</html>

 

home.php

<table width="100%" height="100%" border="1" cellspacing="0" cellpadding="0">
 <tr>
   <td id="menu_vertical" width="18%"><a href="?pagina=home&conteudo=educacao">Educação</a></td>


      <td id="loader_menu_vertical" rowspan="7" align="center">
<?php
if( (isset($SubPg)) and (file_exists($SubPg)) ) {
include($SubPg);
} else {
include ("conteudo/inicio.php");
}
?>
      </td>


 </tr>
 <tr>
   <td id="menu_vertical"><a href="?pagina=home&conteudo=esporte">Esporte</a></td>
 </tr>
 <tr>
   <td id="menu_vertical"><a href="?pagina=home&conteudo=cultura">Cultura</a></td>
 </tr>
 <tr>
   <td id="menu_vertical"><a href="?pagina=home&conteudo=natureza">Natureza</a></td>
 </tr>
 <tr>
   <td id="menu_vertical"><a href="?pagina=home&conteudo=religiao">Religião</a></td>
 </tr>
 <tr>
   <td id="menu_vertical"><a href="?pagina=home&conteudo=politica">Política</a></td>
 </tr>
 <tr>
   <td></td>
 </tr>
</table>

 

Link de referencia para mostra os códigos funcionando

 

Grato desde já pela ajuda dos senhores...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se você quer utilizar .htaccess, porque ainda chama da forma habitual???

 

Isto:

   <td><a href="?pagina=home">Home</a></td>
   <td><a href="?pagina=perfil">Perfil</a></td>
   <td><a href="?pagina=fotos">Fotos</a></td>
   <td><a href="?pagina=videos">Videos</a></td>
   <td><a href="?pagina=faleconosco">Fale Conosco</a></td>

 

Deveria ser assim:

 

   <td><a href="home">Home</a></td>
   <td><a href="perfil">Perfil</a></td>
   <td><a href="fotos">Fotos</a></td>
   <td><a href="videos">Videos</a></td>
   <td><a href="faleconosco">Fale Conosco</a></td>

 

E estes:

 

<tr>
   <td id="menu_vertical"><a href="?pagina=home&conteudo=esporte">Esporte</a></td>
 </tr>
 <tr>
   <td id="menu_vertical"><a href="?pagina=home&conteudo=cultura">Cultura</a></td>
 </tr>
 <tr>
   <td id="menu_vertical"><a href="?pagina=home&conteudo=natureza">Natureza</a></td>
 </tr>
 <tr>
   <td id="menu_vertical"><a href="?pagina=home&conteudo=religiao">Religião</a></td>
 </tr>
 <tr>
   <td id="menu_vertical"><a href="?pagina=home&conteudo=politica">Política</a></td>
 </tr>

 

Deveriam estar assim:

 

<tr>
   <td id="menu_vertical"><a href="home/esporte">Esporte</a></td>
 </tr>
 <tr>
   <td id="menu_vertical"><a href="home/cultura">Cultura</a></td>
 </tr>
 <tr>
   <td id="menu_vertical"><a href="home/natureza">Natureza</a></td>
 </tr>
 <tr>
   <td id="menu_vertical"><a href="home/religiao">Religião</a></td>
 </tr>
 <tr>
   <td id="menu_vertical"><a href="home/politica">Política</a></td>
 </tr>

 

Você está utilizando tudo que é necessário para url rewrite, menos a própria URL.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se você quer utilizar query string, porque ainda chama da forma habitual???

 

Isto:

   <td><a href="?pagina=home">Home</a></td>
   <td><a href="?pagina=perfil">Perfil</a></td>
   <td><a href="?pagina=fotos">Fotos</a></td>
   <td><a href="?pagina=videos">Videos</a></td>
   <td><a href="?pagina=faleconosco">Fale Conosco</a></td>

 

Deveria ser assim:

 

   <td><a href="home">Home</a></td>
   <td><a href="perfil">Perfil</a></td>
   <td><a href="fotos">Fotos</a></td>
   <td><a href="videos">Videos</a></td>
   <td><a href="faleconosco">Fale Conosco</a></td>

 

E estes:

 

<tr>
   <td id="menu_vertical"><a href="?pagina=home&conteudo=esporte">Esporte</a></td>
 </tr>
 <tr>
   <td id="menu_vertical"><a href="?pagina=home&conteudo=cultura">Cultura</a></td>
 </tr>
 <tr>
   <td id="menu_vertical"><a href="?pagina=home&conteudo=natureza">Natureza</a></td>
 </tr>
 <tr>
   <td id="menu_vertical"><a href="?pagina=home&conteudo=religiao">Religião</a></td>
 </tr>
 <tr>
   <td id="menu_vertical"><a href="?pagina=home&conteudo=politica">Política</a></td>
 </tr>

 

Deveriam estar assim:

 

<tr>
   <td id="menu_vertical"><a href="home/esporte">Esporte</a></td>
 </tr>
 <tr>
   <td id="menu_vertical"><a href="home/cultura">Cultura</a></td>
 </tr>
 <tr>
   <td id="menu_vertical"><a href="home/natureza">Natureza</a></td>
 </tr>
 <tr>
   <td id="menu_vertical"><a href="home/religiao">Religião</a></td>
 </tr>
 <tr>
   <td id="menu_vertical"><a href="home/politica">Política</a></td>
 </tr>

 

Você está utilizando tudo que é necessário para url rewrite, menos a própria URL.

 

 

Gabriel Heming, desta forma não funcionou!! Fica aparecendo a mensagem "not-found".

 

Acredito que porque o "?pagina= eo &conteudo=" é o atributo que transforma o link em variável para que assim, o query string consiga identifica-lo...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Gabriel Heming, desta forma não funcionou!! Fica aparecendo a mensagem "not-found".

 

Acredito que porque o "?pagina= eo &conteudo=" é o atributo que transforma o link em variável para que assim, o query string consiga identifica-lo...

 

Sim e não. Se você não estivesse utilizando url rewrite, isso seria correto. Mas você está implementando .htacces e url rewrite, assim, você está definindo como serão passados os parâmetros no próprio .htaccess. Então, a url não é mais da forma tradicional (?pagina= eo &conteudo=) e sim da forma que foi definido no .htaccess.

 

Tenho a ligeira impressão de que você não alterou o arquivo httpd.conf, pois eu lhe perguntei e não obtive resposta.

 

Segue alguns artigos para você ler, pois você não está entendendo o objetivo de url rewrite.

URL Rewriting: Criando URLs competitivas!

TRABALHANDO COM URL AMIGÁVEL COM PHP

 

URL Rewrite não serve para criar url's dinâmicas, e sim para reescrever uma url de uma forma mais amigável, de uma forma mais "humana".

 

Se você não quer transformar em uma url amigável, não há a menor necessidade do .htacces. Falo assim para lhe dar um "chacoalhão", pois você está se confundindo com o que deve ou não ser utilizado.

 

Uma query string, você realiza somente com PHP. O .htaccess nesse contexto, será somente para Url rewrite.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tenho a ligeira impressão de que você não alterou o arquivo httpd.conf, pois eu lhe perguntei e não obtive resposta.

 

Me desculpe por não ter respondido, mas é porque eu não utilizo o Apache.

 

Este httpd.conf existe e pode ser alterado no meu servido online?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sei que o .htaccess roda em alguns servidores além do apache. Mas não roda no IIS, deve ser transcrito.

 

Qual servidor você usa para conseguir usar o .htaccess?

Compartilhar este post


Link para o post
Compartilhar em outros sites
- mod_rewrite enabled (apache 2.2); full dot files support (.htpasswd, .htaccess - posibility to set custom error pages, to block unwanted ips/sites, to turn on/off indexes etc. etc.);

 

Bom, habilitado está. Mas o porque de não estar funcionando....

 

Agora é a outra parte, o que exatamente você quer fazer? Quer apenas que as url's sejam dinâmicas ou que, além de dinâmicas, sejam amigáveis?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom, habilitado está. Mas o porque de não estar funcionando....

 

Agora é a outra parte, o que exatamente você quer fazer? Quer apenas que as url's sejam dinâmicas ou que, além de dinâmicas, sejam amigáveis?

 

Exatamente os dois!!!

 

Eu pus o WampServer e cofigurei o apache ele funcionou, mas nos sub link's "home/esporte" ele fica acrescentando um home amais a cada link clicado(exem: home/esporte, home/home/educacao) e assim por diante...

você saberia o porque de o home ficar sendo acrescentado por cada link amais clicado? tentei resolver isso de várias formas, mas não consegui..

 

No apache funcionou não perfeitamente, mas conseguiu rodar. O defeito deve ser no servidor online. Irei procurar outro que suporte o htaccess.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mande o código dos links e o .htaccess para eu poder verificar.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Gabriel Heming, eu consegui fazer o htaccess funcionar no meu servidor free online com a inclusão desse código no topo do htaccess: RewriteBase /

 

O código dos link's continua sendo o que você me indicou:

 

menu horizontal:

<td><a href="home">Home</a></td>
<td><a href="perfil">Perfil</a></td>
<td><a href="fotos">Fotos</a></td>
<td><a href="videos">Videos</a></td>
<td><a href="faleconosco">Fale Conosco</a></td>

 

menu vertical:

<tr>
   <td id="menu_vertical"><a href="home/esporte">Esporte</a></td>
 </tr>
 <tr>
   <td id="menu_vertical"><a href="home/cultura">Cultura</a></td>
 </tr>
 <tr>
   <td id="menu_vertical"><a href="home/natureza">Natureza</a></td>
 </tr>
 <tr>
   <td id="menu_vertical"><a href="home/religiao">Religião</a></td>
 </tr>
 <tr>
   <td id="menu_vertical"><a href="home/politica">Política</a></td>
 </tr>

 

O .htaccess também continua sendo o que você me indicou com a simples inclusão do código RewriteBase / no topo:

RewriteBase /
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([\w]+)\/?$ ?pagina=$1
RewriteRule ^([\w]+)\/([\w]+)\/?$ ?pagina=$1&conteudo=$2

 

 

você verá o exemplo rodando no link a seguir: http://exemplos.orgfree.com/

E você também verá o defeito no menu vertical.

Compartilhar este post


Link para o post
Compartilhar em outros sites

E ai galera, alguém poderia me ajudar a resolver este impasse...

 

Pode ser qualquer ajuda!!

Me dizendo aonde está o erro.

Dando alguma ideia.

Algo que seja construtivo!!!

 

 

Grato desde já pela ajuda dos senhores...

Compartilhar este post


Link para o post
Compartilhar em outros sites

galera o código que estou utilizando é este:

 

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([a-z,0-9,A-Z]+)\/?$ ?pagina=$1
RewriteRule ^([a-z,0-9,A-Z]+)\/([a-z,0-9,A-Z]+)\/?$ ?pagina=$1&conteudo=$2

 

O problema é que nos sublink's o htacces está acrescentando um home amais a cada link clicado (exemplo: home/esporte, home/home/educacao) e assim por diante...

Acredito que o "RewriteRule ^([a-z,0-9,A-Z]+)\/?$ ?pagina=$1" está entrando em conflito com o "RewriteRule ^([a-z,0-9,A-Z]+)\/([a-z,0-9,A-Z]+)\/?$ ?pagina=$1&conteudo=$2". Teria com eu usar o operador XOR para que desta forma impedisse que o navegador leia os dois código ao mesmo tempo?

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.