Trabalhando com busca usando Url Amigável

Para quem trabalhar com URL amigável, um momento terá que trabalhar com busca, e também paginação, provavelmente encontrará um entrave nessa situação.

Nos formulários utilizamos o método GET, para se precisarmos manter as informações de pesquisar, principalmente na paginação, podemos passar essas informações na URL.

Se você utilizou um formulário com método GET já reparou que ele adiciona um sinal de interrogação na URL, porque dessa forma está dizendo que está passando parâmetros e valores.

Mas se você estiver utilizando no seu . htaccess,  essa expressão abaixo, onde utilizamos o parâmetro pg para definir que tipo página será chamada, você encontrará um problema:

RewriteRule (.*) índex.php?pg=$1

Vamos dizer que para realizar a busca ficaria assim a URL

www.seusite.com.br/pesquisar?busca=palavra

Só que lembre, que na verdade a forma que será vista pelo servidor[bb] será essa:

www.seusite.com.br/index.php?pg=pesquisar?busca=palavra

Mas o problema de ocorrer isso? Simples, por padrão o RewriteRule irá substituir a query string (?pg=pesquisar), pela mais recente (?busca=palavra), e com isso você não terá mais o valor pg pra definir a página, e com isso a pagina de pesquisa nunca será chamada.

Para resolver isso, basta adicionamos uma flag no RewriteRule, que irá mesclar as duas querystring, sendo interpretado dessa forma:

www.seusite.com.br/index.php?pg=pesquisar&busca=palavra

A flag é [QSA], ficando assim RewriteRule:

RewriteRule (.*) índex.php?pg=$1 [QSA]

Com essa modificação, você não terá problema em a query string ser reescrita.




Se o conteúdo foi relevante para você, e desejar, você pode incentivar fazendo uma doação.

22 thoughts on “Trabalhando com busca usando Url Amigável

  1. Ola David, então eu adicionei este comando no meu htacess, mas como faço para remover o GET da url, esta assim ainda ?s=PALAVRA-CHAVE

    1. Vc terá q recuperar os valores via javascript, e montar a URL, e enviar pra página com nova URL, exemplo:

      <form action="" id="formBusca" method="get">
      			<input type="text" name="busca" id="busca" />
      			<input type="submit" value="Buscar" />
      	</form>
      
      
      $(function(){
         $("#formBusca").submit(function(){
               var busca = $("#busca").val();
               window.location = 'http://www.seusite.com.br/buscar/'+busca;
            return false;
         });
      });
      
      
      
    1. Vc quer acessar um link pra um arquivo PDF ? Vc pode acessar normalmente, desde q tenha essa regra no seu htaccess:

      RewriteCond %{REQUEST_FILENAME} !-f

    1. Vc pode tentar fazer algo assim:

      RewriteEngine On
      RewriteCond %{HTTP_HOST} ^www\.
      RewriteCond %{HTTPS}s ^on(s)|off
      RewriteCond http%1://%{HTTP_HOST} ^(https?://)(www\.)?(.+)$
      RewriteRule ^%1%3%{REQUEST_URI} [R=301,L]
      
      RewriteCond %{REQUEST_FILENAME} !-f
      RewriteCond %{REQUEST_FILENAME} !-d
      RewriteRule ^(.*) index.php?pg=$1 [L,QSA]
      
  2. Não funcionou =/

    Meu .htaccess esta assim atualmente.

    RewriteEngine on

    # if a directory or a file exists, use it directly
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d

    # otherwise forward it to index.php
    RewriteRule . index.php

  3. Aqui não deu certo. Já adicionei [QSA] no final da linha do RewriteRule e mesmo assim não funciona. O servidor lê a url somente até onde tem o ponto de interrogação (?) e ignora o restante

  4. Boa dia amigo,
    Eu tenho um site aqui.. que ele trabalha da seguinte forma:
    Eu passo por um parâmetro chamado pag com o nome da página que será visualizada e no arquivo index.php é feito um tratamento para exibir essa determinada página..
    Por exemplo:
    localhost/?pag=adm é exibido a pagina de administração.
    Como eu poderia fazer para esconder esse parâmetro?
    Algo que ficasse assim:
    Se fosse pag=adm, no lugar de exibir como descrito acima fosse mostrado localhost/adm..
    ou no caso de ?pag=contato fosse exibido localhost/contato ?

    Alguem tem alguma ideia?

  5. Boa Tarde, David

    Estou fazendo um site com url amigável, mas me apareceu um entrave no qual já vasculhei, procurei, tentei e nada até agora.

    Como fazer funcionar phpthumb com a url amigável?

    Tenho o arquivo desta maneira:


    id”;
    $resultado_fot = mysql_query($consulta_fot);
    $registros_fot = mysql_num_rows ($resultado_fot);

    $filename =”http://www.meusite.com.br/teste/remoto/galeria_fotos/”;
    $filename .= “foto_galeria_”.”$linha->id”.”.jpg”;
    if (file_exists($filename))
    {
    list($largura, $altura) = getimagesize($filename);
    }

    // formata a data no padrão brasileiro
    $data = explode(‘-‘, $linha->data);
    $data = $data[2].’/’.$data[1].’/’.$data[0];

    ?>

    $altura)
    {
    echo “”;
    }
    else
    {
    echo “”;
    }
    }
    ?>

    Mas não funciona de jeito nenhum, as imagens ficam quebradas.

    Se possível for me ajude com isto porque sei que deve ser algo extremamente simples, mas infelizmente não consigo enxergar.

    Obrigado

    1. Faça o seguinte, no head do seu html, adicione:

      <base href="http://seusite.com.br" />
      

      Caso não funcione, coloque a URL completa até a sua imagem ou arquivo referente a imagem

  6. Fiz questão de comentar aqui, era o que eu estava procurando há um tempo e ajudou muito.
    Simples e objetivo
    Valeu

  7. Cara!!! Você salvou a minha pele veio… Excelente postagem! Já estava para criar uma função para pegar a danada da variável GET. kkkk

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *