A maioria dos tutoriais trata das url amigáveis da seguinte forma:

RewriteEngine On 
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteRule ^(.*)$ index.php?page=$1

Só que desta forma fica extremamente difícil de fazer com mais de um parâmetro. Então como fazer para ser mais simples.

O que descrevo aqui eu uso neste Blog e meu site.

Criando o arquivo .htaccess

Os arquivos .htaccess (ou "arquivos de configuração distribuída") oferecem um meio de fazer mudanças nas configurações por-diretório. Um arquivo, contendo uma ou mais diretrizes de configurações, é colocado em um diretório em particular, e as diretrizes se aplicam para aquele diretório e todos os seu subdiretórios subseqüentes.
Leia mais: http://httpd.apache.org/docs/2.2/pt-br/howto/htaccess.html

Primeiro crie um arquivo .htaccess na pasta raiz do site ou sistema que você esta criando. A ele adicione o seguinte conteúdo.

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php [L]

Se você estiver usando Linux ou MAC, este arquivo se tornará oculto. Para visualizá-lo no terminal digite ls -a.

Agora vamos entender o que escrevi em cada uma das linhas acima.

RewriteEngine On

Ativa o suporte à reescrita de URL. Isso significa que as URL poderão ser direcionadas para um determinado arquivo no apache.

RewriteCond %{SCRIPT_FILENAME} !-f

Não aplica a condição para arquivos que existam. Isso significa que as imagens, CSS, JS e outros arquivos que já existem continuarão funcionando perfeitamente.

RewriteCond %{SCRIPT_FILENAME} !-d

Não aplica a condição para diretórios que existam

RewriteRule . index.php [L]

Arquivo para onde deve ser direcionado as requisições. Isso significa que tudo que for digitado no browser, após a pasta que esta este .htacces e que não exista, será direcionado para o arquivo index.php.

Se tiver dúvida acesse o site do apache em http://httpd.apache.org/docs/current/mod/mod_rewrite.html.

Tratando as requisições

Mais agora você deve estar se perguntando. Como verifico as variáveis passadas para a minha aplicação? Simples, vamos criar uma classe Url que vai ler a URL, excluir tudo que não pertencer ao projeto.

Veja a classe abaixo:

<?php
class Url
{
    private static $url = null;
    private static $baseUrl = null;

    public static function getBase()
    {
        if( self::$baseUrl != null )
            return self::$baseUrl;

        global $_SERVER;
        $startUrl = strlen( $_SERVER["DOCUMENT_ROOT"] );
        $excludeUrl = substr( $_SERVER["SCRIPT_FILENAME"], $startUrl, -9 );
        if( $excludeUrl[0] == "/" )
            self::$baseUrl = $excludeUrl; 
        else
            self::$baseUrl = "/" . $excludeUrl;
        return self::$baseUrl;
    }

    public static function getURL( $id )
    {
        // Verifica se a lista de URL já foi preenchida
        if( self::$url == null )
            self::getURLList();
        
        // Valida se existe o ID informado e retorna.
        if( isset( self::$url[ $id ] ) )
            return self::$url[ $id ];
        
        // Caso não exista o ID, retorna nulo
        return null;
    }
    
    private static function getURLList()
    {
        global $_SERVER;
        
        // Primeiro traz todos as pastas abaixo do index.php
        $startUrl = strlen( $_SERVER["DOCUMENT_ROOT"] ) -1;
        $excludeUrl = substr( $_SERVER["SCRIPT_FILENAME"], $startUrl, -10 );
        
        // a variável$request possui toda a string da URL após o domínio.
        $request = $_SERVER['REQUEST_URI'];
        
        // Agora retira toda as pastas abaixo da pasta raiz
        $request = substr( $request, strlen( $excludeUrl ) );
        
        // Explode a URL para pegar retirar tudo após o ?
        $urlTmp = explode("?", $request);
        $request = $urlTmp[ 0 ];
        
        // Explo a URL para pegar cada uma das partes da URL
        $urlExplodida = explode("/", $request);
        
        $retorna = array();

        for($a = 0; $a <= count($urlExplodida); $a ++)
        {
            if(isset($urlExplodida[$a]) AND $urlExplodida[$a] != "")
            {
                array_push($retorna, $urlExplodida[$a]);
            }
        }
        self::$url = $retorna;
    }
}
?>

Como esta classe funciona

Lembre-se: Para evitar problemas de compatibilidade, é necessário que todas as URL sejam absolutas. Ou seja, devem referenciar desde a raiz.

URL absoluta é uma URL que aponta sempre para o mesmo ponto, independente de qual local no site ele esteja sendo chamado. Uma URL absoluta pode iniciar com HTTP:// e conter todo o domínio ou somente com / e referenciar a raiz do domínio.
Ex de URL absoluta:

<link rel="stylesheet" type="text/css" href="/code/10000/css/style.css"/>

URL relativa é uma URL que muda conforme a sua localização no site.
Ex de URL relativa:

<link rel="stylesheet" type="text/css" href="css/style.css"/>

Assim que chamamos pela primeira vês o método estático Url::getURL( $id ) ele verifica a URL e monta uma lista contendo as variaveis passadas ao sistema.

Então vamos criar um teste simples. Vou utilizar um exemplo do Maujor (goo.gl/60L5H) para isso.

Vamos ver o arquivo index.php usando a classe:

<?php
require "classes/Url.class.php";
?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="pt-br">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta name="author" content="Mauricio Samy Silva / Eduardo Kraus" />
<link rel="stylesheet" type="text/css" href="<?php echo URL::getBase() ?>css/style.css"/>
<title>Trabalhando com URL amigável no PHP</title>
</head>
<body>
<div id="tudo">
    <div id="topo">TOPO</div>
    <div id="principal">
        <?php
        $modulo = Url::getURL( 0 );

        if( $modulo == null )
            $modulo = "modulo1";

        if( file_exists( "modulos/" . $modulo . ".php" ) )
            require "modulos/" . $modulo . ".php";
        else
            require "modulos/404.php";
        ?>
    </div>
    <div id="navegacao">
        <p><a href="<?php echo URL::getBase(); ?>modulo1">Módulo 1</a></p>
        <p><a href="<?php echo URL::getBase(); ?>modulo2">Módulo 2</a></p>
        <p><a href="<?php echo URL::getBase(); ?>modulo3">Módulo 3</a></p>
        <p><a href="<?php echo URL::getBase(); ?>modulo4">Módulo 4</a></p>
        <p><a href="<?php echo URL::getBase(); ?>modulo5">Módulo 5</a></p>
        <p><a href="<?php echo URL::getBase(); ?>modulo6">Módulo 6</a></p>
        <p><a href="<?php echo URL::getBase(); ?>modulo7">Módulo 7</a></p>
        <p><a href="<?php echo URL::getBase(); ?>modulo8/parametro/sei-la/alguma_coisa/25/quase-nada">
            Módulo 8 com sub-módulo</a></p>
        <p><a href="<?php echo URL::getBase(); ?>qualquer">Módulo 404</a></p>
        <p><a href="<?php echo URL::getBase(); ?>teste.php">Teste.php</a></p>
    </div>
    <div id="rodape">RODAPE</div>
</div>
</body>
</html>

Então, no módulo8 eu criei uma programação PHP para receber estes dados e analiza-lo. Veva os dois links abaixo:

Veja o exemplo rodando completo em http://php.eduardokraus.com/code/10000/

Quer o código fonte completo deste exemplo? Clique aqui.

Gostou? Não esqueça de curtir!

164 comentários

Deixe uma resposta

  1. Boa tarde, amigo eu consegui aplicar o exemplo corretamente, agradeço é uma ótima explicação, hoje com o projeto todo montado localmente funciona corretamente, porém quando subi ele para o servidor, ele da erro 404 do próprio servidor como se os modulos não existissem em páginas alguma.
    Já pesquisei muito e não consegui descobrir onde poderia está o erro, mas suponho que seja na função:

    public static function getBase()
        {
            if( self::$baseUrl != null )
                return self::$baseUrl;

            global $_SERVER;
            $startUrl = strlen( $_SERVER["DOCUMENT_ROOT"] );
            $excludeUrl = substr( $_SERVER["SCRIPT_FILENAME"], $startUrl, -9 );
            if( $excludeUrl[0] == "/" )
                self::$baseUrl = $excludeUrl;
            else
                self::$baseUrl = "/" . $excludeUrl;
            return self::$baseUrl;
        }

    a função deve retornar um valor para conseguir encontrar o arquivo link.php dentro de "meudominio/pasta01/modulos/ ". E esse valor não está sendo retornado.

    Consegue me ajudar?

     
  2. Mas se eu quiser mudar o title da página?

     
  3. Eu hoje uso um sistema que trata a página antes montar o template. Com isso, quando carrego o template tenho o título da página

     
  4. Parabéns pelo artigo completo!
    Manter uma página para visualização e link para download ajuda muito.
    Ainda não apliquei em meu projeto, mas vi que funciona perfeitamente.

    Parabéns.

     
  5. Bom dia. Eu usei os métodos acima e funcionou perfeitamente. Só que eu não consegui usar o mesmo método para fazer redirecionamentos de URL. Algo do tipo:
    <meta HTTP-EQUIV='Refresh' CONTENT='0;URL=<?php echo URL::getBase(); ?>listagem>

    Ou algo do tipo:

    <?
    echo "<meta HTTP-EQUIV='Refresh' CONTENT='0;URL= URL::getBase();.listagem>";

    Então, o método acima só se aplica a links href ?
    Ou existe algum modo de usar para redirecionar URLs ?
    ?>

     
  6. Só tenho a agradecer, excelente classe.

     
  7. Desculpe as repetições. O formulario dava erro de Timeout. e registrou vários iguais.

    Por gentileza, desconsidere e deixe apenas 1.
    Obrigado

     
  8. Parabéns Eduardo pela qualidade da função.

    Por gentileza, vc pode me orientar como usar em subdomínios que tem index.php?
    estrutura:
    .htaccess
    classes
    index.php (pag inicial - A sua função está OK)
    cursos
          /matematica/index.php e várias páginas
          /ciencias/index.php e várias páginas
          /ingles/index.php e várias páginas
          são dezenas de subdomínios

    Agradeço muito a sua ajuda, pois estou me debatendo a dias.  

     
  9. Parabéns Eduardo pela qualidade da função.

    Por gentileza, vc pode me orientar como usar em subdomínios que tem index.php?
    estrutura:
    .htaccess
    classes
    index.php (pag inicial - A sua função está OK)
    cursos
          /matematica/index.php e várias páginas
          /ciencias/index.php e várias páginas
          /ingles/index.php e várias páginas
          são dezenas de subdomínios

    Agradeço muito a sua ajuda, pois estou me debatendo a dias.  

     
  10. Parabéns Eduardo pela qualidade da função.

    Por gentileza, vc pode me orientar como usar em subdomínios que tem index.php?
    estrutura:
    .htaccess
    classes
    index.php (pag inicial - A sua função está OK)
    cursos
          /matematica/index.php e várias páginas
          /ciencias/index.php e várias páginas
          /ingles/index.php e várias páginas
          são dezenas de subdomínios

    Agradeço muito a sua ajuda, pois estou me debatendo a dias.  

     
  11. Parabéns Eduardo pela qualidade da função.

    Por gentileza, vc pode me orientar como usar em subdomínios que tem index.php?
    estrutura:
    .htaccess
    classes
    index.php (pag inicial - A sua função está OK)
    cursos
          /matematica/index.php e várias páginas
          /ciencias/index.php e várias páginas
          /ingles/index.php e várias páginas
          são dezenas de subdomínios

    Agradeço muito a sua ajuda, pois estou me debatendo a dias.  

     
  12. Parabéns Eduardo pela qualidade da função.

    Por gentileza, vc pode me orientar como usar em subdomínios que tem index.php?
    estrutura:
    .htaccess
    classes
    index.php (pag inicial - A sua função está OK)
    cursos
          /matematica/index.php e várias páginas
          /ciencias/index.php e várias páginas
          /ingles/index.php e várias páginas
          são dezenas de subdomínios

    Agradeço muito a sua ajuda, pois estou me debatendo a dias.  

     
  13. Parabéns Eduardo pela qualidade da função.

    Por gentileza, vc pode me orientar como usar em subdomínios que tem index.php?
    estrutura:
    .htaccess
    classes
    index.php (pag inicial - A sua função está OK)
    cursos
          /matematica/index.php e várias páginas
          /ciencias/index.php e várias páginas
          /ingles/index.php e várias páginas
          são dezenas de subdomínios

    Agradeço muito a sua ajuda, pois estou me debatendo a dias.  

     
  14. Ta beleza fiz o sistema na minha index funcionou perfeitamente, porem na minha index tem o login p painel administrativo e no meu painel administrativo é outro layout eu queria usar o mesmo sistema p exibir as paginas dentro do painel diferente da index como eu faço isso ?

     
  15. Como eu faria para usar com mvc, para acessar varios diretorios?

     
  16. Vlw! Amigo você ajudo muito!

     
  17. Olá Eduardo, Boa tarde!

    Eu implementei o código em questão e ele realmente funciona com sucesso, obrigado pela ajuda!

    Mas acho que encontrei um problema que não sei como resolver.

    Se vc acessar, meusite.com.br/dasdas ele vai retornar a pagina de erro corretamente, mas se por algum motivo, acessar
    meusitem.com.br/modulo/dsadasdas (ele nao retorna.) sabe como resolver isso?
    tipo o site tá retornando a 404 somente no domínio sem parâmetro.

    obrigado

    Diego

     
  18. Isso acontece porque você não configurou corretamente o arquivo .htaccess

     
  19. Edu, mas o seu faz isso tb, acabei de testar ..

    Precisa colocar erro document 404 no .htaccess ?

    O erro acontece somente qdo vc está em um diretório q possui um caminho válido .. é como se ele continuasse a interpretar o endereço como variável ...

    Abraços

    Diego

     
  20. Eu sei que não é uma pergunta ligada ao PHP mas eu realmente gostaria de saber se existe uma forma sem uso do .htaccess" de acessar uma página pela URL sem criar um diretório com o mesmo nome da url e um index.html lá dentro como por exemplo:"http://www.meusite.com.br/produtos/como-acessar-o-produto-pela-url" e acessar o index.html lá dentro.
    Obs:creio quem já fez site estático com html puro sabe me responder.

     
  21. Como faria pra colocar outra pasta nos sistema por exemplo cliente, além da pasta módulos?

     
  22. Eduardo boa noite ! é essa estrutura de url amigável que você usa em seu site ou é um outro usando a estrutura MVC ?

    abraços.

     
  23. Este blog aqui e o http://www.eduardokraus.com usam esta estrutura.

     
  24. Mais existem centenas de validações antes, mais a classe Url é basicamente a mesma.

     
  25. Amigão, tenho um site que fiz em um endereço abc.produzindo.com mas não quero que apareceça essa url e sim vg2.com.br e que todos os links apareçam despois do vg2.com.br. Como eu usaria neste exemplo que passou?

     
  26. Como farei pra proteger a pasta "modulo" caso acesse direto meusite.com.br/modulo
    ???

     
  27. Con arquivo .htaccess

     
  28. Não entendi, como?

     
  29. Achei aqui, colocando isso abaixo no .htaccess:
    =======================================
    <files ~ "^.*\.([Hh][Tt][Aa])">
    order allow,deny
    deny from all
    satisfy all
    </files>

    deny from all
    =======================================

    Ao acessar a pasta, vai dar página de erro.

    Obrigado pelo script e correndo atrás foi possível aprender um pouco mais sobre .htaccess.

    Obrigado Eduardo.

     
  30. Amigo, utilizo seu script e me atende perfeitamente, obrigado! Belo trabalho!!  Hoje necessitei alterar para barrar alguns caracteres pois poderia passar injection. Melhor tratar uma vez do que repetir codigo em todo site. Bom... inclui na getURLList() o seguinte código: $urlExplodida[$a] = ereg_replace("[ \t\n\r]+", " ", str_replace(array("'",'"',"%20","%","&",";"), array("","","","","",""), $urlExplodida[$a]));

    Basicamente estou tirando aspas simples, duplas, porcento e etc.

    Quem necessitar, ta aí o código!

    Abraços

     
  31. Porque o teste.php nao e afetado? eu nao entendi

     
  32. Porque o .HTACCESS só redireciona as URL não localizada

     
  33. Sim que ele nao localiza ok mas o porque qual a lógica para que certos arquivos nao sejam localizados? O que fazer entende?

     
  34. RewriteCond %{SCRIPT_FILENAME} !-f

    o ! antes do -f diz que só file not found

     
  35. me desculpe mas nao entendi?

    RewriteCond %{SCRIPT_FILENAME} !-f

    o ! antes do -f diz que só file not found

    nesse trecho que voce escreveu nao tem nada dizendo que teste.php nao é pra redireciona pode ser mais claro? por exemplo o arquivo exemplo.php o que faço pra ele nao ser afetado alguma linha nele? pode ser  mais especifico?

     
  36. Então, diz ao HTACESS para só aplicar a regra de redirecionamento de o arquivo não existir. o teste.php existe e por isso ele ignorará na regra.

     
  37. alem desse problema esta dando problema com ajax pode me ajudar?

     
  38. Use sempre URL Absoluta. Nunca URL relativa

     
  39. isso quer dizer o que? sou iniciante pode me explicar melhor? o que tenho que fazer para nao da problema no ajax

     
  40. valeu mesmo! meu problema era semelhante a um comentario pode ser que lhe ajude Ramon.

    Mais um duvida é possivel fazer com que url com filtros tipo pesquisa?variavel=1&variavels=2 fique mais amigavel por exemplo tirar ? e o &

     
  41. Podes fazer sim. Mais direto de um FORM não.

    Faz via POST ao invés de GET.

     
  42. Tem solução pra problema no comando header? esta dando erro.

     
  43. No ajax eu tenho campos estado onde eu escolho um e entao apos o ajax carrega os campos cidades porem ele esta trazendo o corpo do site como nessa imagem https://drive.google.com/file/d/0B6EJl7FKJuBOaUw0MHBnUzYtVms/view?usp=sharing

    Ele incorpora o corpo do site ao inves de trazer apenas o select com as cidades como corrijo?

     
  44. Use sempre URL absoluta e nunca relativa.

     
  45. Ola seu exemplo e muito bom porem para url com filtros que usam varias variaveis por get e arquivo em outras pastas nao funciona ou melhor eu nao consegui fazer funcionar por exemplo index/modulos aqui todos arquivos das paginas porem se for index/modudos/pasta1 colocar uma pagina aqui ele da como inexistente pode ajudar?

     
  46. Eu consegui fazer funcionar... agora so nao estou conseguindo tratar url com mais de um get

     
  47. Eduardo, só uma pergunta, tem como fazer o carregamento das paginas sem refresh usando ajax junto com esta tua classe? Eu estou me acabando aqui mas como não entendo nada de javascript, não estou conseguindo fazer funcionar, já li uns tutoriais e vou tentando adaptar, aparentemente não é difícil não, mas eu não estou conseguindo. Se tiver tem como mostrar o caminho? o resto eu vou estudando e vejo se consigo fazer, se eu conseguir posto aqui o resultado.

    Obrigado novamente.

     
  48. É basicamente aquilo mesmo, eu coloquei um slide no topo da index em um site que estou fazendo pra um amigo e quando ele viu o site, gostou bastante mas daí percebeu que o slide volta para a primeira imagem e me pediu pra ver se eu conseguia fazer sem dar refresh, eu consigo facilmente fazer em um site sem url amigável mas nunca fiz em um com url amigável e principalmente este da sua classe que estou me familiarizando agora, nem faço ideia como se faz, fiquei até com dor de cabeça, sério mesmo.

    Cara adorei o site que você mostrou no link. Interessante também os cursos e preços.
    Tentei me inscrever no curso de Jquery mas quando envio o formulário de matrícula, cai numa página fora do ar.

     
  49. Estou com problemas com o css, alguns estilos não funcionam, tipo background:#000; e também o css em input, sei que estou fazendo certo os estilos aí informados porque fiz teste em página separada.

    Minha pergunta é. Você tem conhecimento de casos como o meu? Devo dizer que a folha de estilos está conectada perfeitamente porque o layout está funcionando. Tem alguma ideia do que pode estar acontecendo?

    Desde já agradeço.

     
  50. Para isso tens que usar o Firebug do Firefox, ou o inspetor do Chrome para ver o porque o elemento não pega a característica passada pelo CSS.

     
  51. Pelo Chrome DevTools observei que o elemento background da div.box não estava sendo renderizado, voltei para o css e achei o erro, era que eu não tinha fechado alguns estilos acima, sendo assim estava dando erro daquele estivo pra baixo.

    Desculpa fazer você perder tempo com esta minha falta de atenção. O engraçado é que eu tenho total interesse em css mas me passou isso, nunca tinha dado este erro comigo justamente porque me importo significativamente com o css, agora quando me acontecer algo parecido vou direto pra folha de estilo repassar linha por linha.

    Estou adorando trabalhar com a sua classe, valeu, realmente uma mão na roda. Parabéns.

     
  52. Olhe este artigo aqui http://php.eduardokraus.com/qual-a-melhor-ide que eu falo de IDE. No caso, o PHPStorm mostra erro se isso acontecer.

     
  53. Eduardo boa noite. estou iniciando meus estudos com html e php, fiz uns testes local com o php server e funcionou legal. então resolvi testar no site, hospedado na hostgator e da esse erro tem noção do que poderia ser ? esse erro acontece ao entrar diretamente no site. tanto na raiz ou se for em diretório. desde já agradeço sua atenção.

    Warning: require(/classes/url.php) [function.require]: failed to open stream: No such file or directory in /home/micro620/public_html/index.php on line 2

    Fatal error: require() [function.require]: Failed opening required '/classes/url.php' (include_path='.:/opt/php54/lib/php') in /home/micro620/public_html/index.php on line 2

     
  54. bom, obrigado pela atenção e perdão pelo incomodo. já consegui resolver o problema.

    uma simples letra maiuscula no nome do arquivo atrapalhou, sendo no que no servidor local não fez diferença isso.

    abç

     
  55. Eduardo, estou com problema que ao passar um get a pagina de recebimento esta desconfigurando,exemplo:

    pagina_get/2

    aí ela desconfigura todo layout e se eu nas outras paginas normais eu colocar a barra ( / ) , exemplo:

    pagina_normal/

    ela também esta desconfigurando, mas a navegação funciona normalmente, questão esta sendo esses detalhes, saberia me dizer o que esta causando isso? Obrigado desde já

     
  56. Isso acontece porque você não colocou os CSS e JS com URL absoluta.

    Lembre-se, todas as URL ou devem começar com HTTP:// ou com /

    Ex:
    <link rel="stylesheet" href="/css/style.css">

    ou
    <link rel="stylesheet" href="http://seusite.com/css/style.css">

     
  57. bom dia
    estou fazendo um portal com hotsites mas nao estou conseguindo criar as url
    a estrutura é assim:
    dominio/web/templates/template_1
    meu index.php está dentro da pasta web/
    e a partir do index.php dela chama index.php do template selecionado template_1, template_2 etc

     
  58. Tens as partes da URL e é só tratar cada uma delas em separado.

     
  59. Por favor, pode me responder uma dúvida.

    Preciso salvar o script dentro das tags <ifModule>script</ifModule>

    Obrigado,

    Atee,.

    Édipo

     
  60. Qual SCRIPT?

    não entendi o que queres fazer

     
  61. Olá, Eduardo!

    Obrigado pela atenção! Já sanei a dúvida, que era em relação a salvar o arquivo .htacces

    Obrigado.

     
  62. Explicação e script disponibilizados simplesmente perfeitos. Trabalho com WordPress, mas precisei fazer um trabalho sem banco de dados em HTML5/PHP, depois de muita procura de como habilitar as URL amigáveis na internet (um que funcionasse), encontrei a tua postagem, então o código serviu como uma luva. Muito obrigado por compartilhar

     
  63. Obrigado pelo comentário.

     
  64. kkkk tinha quase certeza que a resposta seria essa. Já pedi para meu cliente trocar o tipo de Hospedagem de Windows para Linux.

     
  65. Boa tarde estou testando esta função localmente e no servidor.

    Em Localhost os links aparecem assim:
    <link rel="stylesheet" href="/SiteTeste/app/public/css/style.css">
    No Servidor aparece assim:
    <link rel="stylesheet" href="/\siteteste\app/public/css/style.css">

    Dando um echo na function: URL::getBase();
    Em Localhost:/SiteTeste/
    No Servidor: /\siteteste\

    Alguém passou por isso? Ou sabe como resolver?
    Desde já obrigado pela atenção.

     
  66. Barras invertidas só acontecem em servidores ruWindows o que não deve ser usado para hospedagem.

    Leia mais: http://moodle.eduardokraus.com/moodle-em-linux-ou-windows

     
  67. Eduardo como faço para deletar um usuario no banco enviando a requisição para a mesma pagina?
    Exemplo,normalmente faço assim:

    caminho da pagina SISTEMA/LISTA_USUARIOS

    link para deletar <a href="LISTA_USUARIOS&ACAO=DEL&COD={$users['id_user']}">Deletar</a>

    if(isset($_GET['acao']) == "del")
    {
      executo a class
    }

    mas e agora como faria usando sua classe URL?
    Tentei assim mas não funcionou:
    <a href='".Url::getBase()."lista_usuarios/?del={$users['id_user']}'>Deletar</a>

     
  68. Eu faço assim:
    <a href='".Url::getBase()."lista_usuarios/deletar/{$users['id_user']}'>Deletar</a>

     
  69. Nao consegui executar dessa forma, fiz assim

    if(isset($_GET["del"]))
        {
            $codigo = Url::getURL(1);
            $objU->setId($codigo);
            $objU->delete();
        }

    <a href='".Url::getBase()."lista_usuarios/del/{$users['id_user']}'>Deletar</a>

    mas não acontece nada

     
  70. Mais ai não tens mais o $_GET["del"]. Tens assim:

    if( Url::getURL( 1 ) == 'delete' )
        // Deleta usuário Url::getURL( 2 );

     
  71. Obrigado Eduardo, nem me toquei dessa questão que agora não se usa mais o $_GET , funcionou

     
  72. Amigo, teria como adptar isso neste sistema?

    Ops posso postar links de outros blogs?

     
  73. Opa, então, tentei usar este sistema de templates
    http://www.revista-programar.info/artigos/sistema-basico-de-templates-em-php/1/ só que não consigo adpta-lo, você acha que consigo fazer isso?

    Obs: não quero usar o Plates, Smarty etc....

     
  74. Neste que postasse o link ele não usa nenhuma biblioteca do Smarty e nem do Plates.

     
  75. Olá, Eduardo tudo bem!

    A minha dúvida é simples pra você que entende, porém um tanto complicada para mim, já que a minha área é SEO.

    Estou trabalhando em um projeto, pra fica melhor de entender » http://www.garotabrasil.com.br

    A minha dúvida é,
    como tornar as urls deste site amigaveis já que ele é um sistema feito no mac com Cada Panic?

    Ficaria muito grato se você pudesse me ajudar com esse problema!

     
  76. Este sistema foi feito em PHP, sendo assim você poderá aplicar o que descrevi aqui.

    Coda Panic é apenas um Editor de PHP/HTML e você pode escolher qualquer outro.

    Leia nest POST como escolher uma IDE para desenvolvimento: http://php.eduardokraus.com/qual-a-melhor-ide

     
  77. Eduardo, obrigado!

    Me ajudou muito o artigo que você escreveu aqui no blog.. Parabéns!!!

    Também não deixei de lê o artigo onde você chegou a nota 100/100% no PageSpeed. Trabalho de mestre!

     
  78. olá eduardo,
    tenho a seguinte situação, tenho uma pagina1.php com 4 listbox e o action é pra pagina2.php via POST. Na pagina2.php recupero os valores assim:
    $var1 = $_POST['var1'];
    $var2 = $_POST['var2'];
    $var3 = $_POST['var3'];
    $var4 = $_POST['var4'];

    como faço para pegar essas 4 variaveis? Tenho que fazer assim:

    $var1 = Url::getUrl(1);
    $var2 = Url::getUrl(2);
    $var3 = Url::getUrl(3);
    $var4 = Url::getUrl(4);

    Agradeço desde ja e aguardo resposta

     
  79. Quando enviares um POST você recupera como um POST normal. Só os dados da URL que você recupera com com a classe que eu desenvolvi.

     
  80. obrigado Eduardo

     
  81. Eduardo estou com problema que minhas paginas estão ficando assim:
    http://meusite.com.br/prinempresa

    Esta vindo uma parte do arquivo principal.php que utilizo, mas navega normalmente, mas esta com essa inclusão das inicias do arquivo principal.php, o que pode ser? Meu .htaccess esta assim:

    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . principal.php [L]

     
  82. Use assim:

    RewriteEngine On
    RewriteBase /
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /principal.php [L]

     
  83. aí nem funciona assim, da pagina não encontrada

     
  84. O arquivo principal.php esta na mesma pasta do arquivo .htaccess?

     
  85. sim esta Eduardo

     
  86. Eduardo resolvi o problema usando agora o arquivo principal.php , analisando o codigo percebi que voce fazia a manipulação no tamanho do arquivo index.php , então mudei essas linhas e deu certo.

            $excludeUrl = substr( $_SERVER["SCRIPT_FILENAME"], $startUrl, -13 );

            $excludeUrl = substr( $_SERVER["SCRIPT_FILENAME"], $startUrl, -14 );

    Obrigado pela atenção e um excelente script, abraço

     
  87. Eduardo, resolvi o problema mundando o nome do principal.php para index.php e voltei o .htaccess para

    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . index.php [L]

    Mas fica a pergunta, porque com nome principal.php não funcionava?

     
  88. É bem provável que você seu arquivo  esteja com alguma letra maiúscula e linux diferencia maiúsculas das minúsculas.

     
  89. Olá Eduardo.. parabens pelo código.. me ajudou muito aqui!

    Estou com uma duvida.. como por o URL::getBase() nesse código:

    var myPlaylist = [
        
        {
            mp3:'music/music.mp3',
            title:'titulo',
            artist:'artista',
            rating:4,
            buy:'#',
            price:'',
            duration:'5:25',
            cover:'music/capa.jpg'
        },

    No aguardo.. obrigado

     
  90. Eduardo bom dia!

    Não estou conseguindo criar Urls amigáveis para o Moodle.
    Você pode dar uma dica de como fazer?

    Abs,

    Roberto

     
  91. Moodle não tem suporte para URL Amigável.

    URL Amigável precisa ser aplicado apenas no site, já o Moodle que o ambiente de ensino não é preciso.

     
  92. Olá amigo, e se eu querer usar ajax com ssl nas páginas? Complica?

     
  93. Boa noite, EDUARDO!
    Já utilizei esse exemplo em outro projeto, porém, não estou conseguindo em um segundo projeto. A url absoluta está trazendo até o endereço da url raíz. Exemplo: http://www.meusite.com.br/var/www/html/www.meusite.com.br/web/site/noticia/234.

    Porém eu desejo que fique apenas http://www.meusite.com.br/site/noticia/234

     
  94. Olá Eduardo, estou usando sua classe e esta ok, porém o down.php ao invés de baixar o conteúdo de um campo blob sempre baixa o html do index.php ou seja a pagina principal mostrada.
    mudei pra salvar primeiro no server e depois baixar, e mesma coisa, sempre vem a pagina principal que esta no index.php.
    Como posso contornar isso?
    Preciso mudar algo no htaccess?

     
  95. Obrigado Eduardo, pela resposta anterior.
    Amigo não estou conseguindo usar quando está em pasta, sabe como fazer..

    / ok
    /carrinho/ erro

     
  96. Isso pode ser causado pelo HTACCESS não esta sendo liberado no Apache. Leia mais em http://mathiasbynens.be/notes/apache-allowoverride-all

    Segunda hipótese é o mod_rewrite não estar ativado. Leia mais em http://xmodulo.com/2013/01/how-to-enable-mod_rewrite-in-apache2-on-debian-ubuntu.html

     
  97. Isso prejudica nas busca do google SEO já que todos vão para index?

     
  98. Boa pergunta...Mais a resposta é NÃO.

    Isso porque o Google não sabe qual o caminho que os códigos percorrem no servidor.

    Olhe este PDF: http://static.googleusercontent.com/external_content/untrusted_dlcp/www.google.com/pt-BR//intl/pt-BR/webmasters/docs/guia-otimizacao-para-mecanismos-de-pesquisa-pt-br.pdf

     
  99. Boa Tarde Eduardo!

    Como colocar url amigável,exemplo: http://www.etjrs.net somente ter acesso ao endereço principal  e os links não ser visualizado?

     
  100. Olá

    Para evitar que os usuários alterem o ID na URL e acessem dados que não pertencem a ele, você deve validar os dados antes de apresenta-lo.

     
  101. Olá Eduardo, parabéns pelo artigo.

    Minha dúvida é com relação a disposição das DIVs.
    Como posso usar esse método com menu horizontal superior?
    onde a DIV (navegacao) do menu antecede a DIV de trabalho (principal)?

     
  102. A ordem dos fatores não altera o produto.

     
  103. Olá Eduardo,
    Fiz esse exemplo que você passou só não funcionou o modulo 8,
    os outros ficaram perfeitos.
    Presisava de uma url assim:

    http://www.site.com.br/produto/carro-vermelho

    Pode por favor falar a linha que falta no arquivo .htaccess
    e o php, pra chamar essa Url!

     
  104. Bom dia Eduardo.

    Me bati um monte para validar uma url de uma página que não existe, mais graças ao seu belo código, tudo é possível.

    Até agora um único problema está me atrapalhando.

    Nos links do css, imagens e menu usamos <a href="<?php echo URL::getBase(); ?></a>

    Correto, funciona que é uma blz. Porém, por exemplo em um select onde trago todos os posts da tabela(por exemplo), tenho que fazer o link para cada um. Eu fiz assim:

    echo "<a href="'.URL::getBase().'/'.$categoria.'/'.$slugPost.'</a>"
    Porém URL::getBase() não executa, ou seja, o link fica quebrado, é pra ser assim meusite.com/categoria/titulo-exemplo-de-post, mais fica assim /categoria/titulo-exemplo-de-post.

    Não sei se falei de mais, e não expliquei direito, mais espero que com sua experiência não seje tão complicado.

    Obrigado, e mais uma vez, parabéns pelo ótimo código.

     
  105. A variável getBase() possui a URL após o domínio até chegar no seu sistema e não contém o domínio.

    Ex: Se seu sistema estiver instalado em meusite.com/sistema/ o valor do getBase() será "/sistema/" e se instalar na raiz será "/".

    Se você precisar que retorne também o domínio é necessário você adicionar.

     
  106. Tenho um site de noticias, no qual esta informando no final da URL a ID da noticias. Inclusive uso as tabelas no WordPress e o mesmo criava um "Slog" com o titulo do post como URL. Como faria isto funcionar em meu sistema pegar o titulo colocando "-" entre os espaços e removendo acentos das palavras?

     
  107. A função strrchr() encontra a última ocorrência na STRING.

    Então busque na URL pelo "-" e por esta posição pegue o ID. Assim:

    $pos = strrchr( $url, "-" );
    $ID = substr( $url, $pos );
    Ai esta seu ID.

     
  108. Olá, tudo bem?
    Usei seu script e tá ficando show... porém tô com um probleminha aqui, tenho minha index normal que com um list-box que chama algumas cidades num arquivo chamado cidade.php, até aí tudo ok! Acontece que quando vem a página cidade/parâmetros/nome-cidade a index está vindo junto, fica como fundo da página atual.
    Sabe me dizer por que isto ocorre?

    Desde já agradeço a atenção abços

     
  109. Lembre-se: Para evitar problemas de compatibilidade, é necessário que todas as URL sejam absolutas. Ou seja, devem referenciar desde a raiz.
    URL absoluta é uma URL que aponta sempre para o mesmo ponto, independente de qual local no site ele esteja sendo chamado. Uma URL absoluta pode iniciar com HTTP:// e conter todo o domínio ou somente com / e referenciar a raiz do domínio.

     
  110. Eduardo, bom dia.

    gostaria se saber como faço, para colocar esse paramentro antes do site.
    no seu site esta dessa forma, http://php.eduardokraus.com

    onde php é o parametro depois vem domino do site.
    parametro.dominio.com.br

    e utilizar esse parametro para determinadas funcoes e chamadas dentro do site.

    obrigado,

    Valberg

     
  111. De Portugal, muito obrigado, com este sistema resolvi um grande problema

     
  112. Olá amigo, tudo bem!

    Funcionou certinho no resto do site!

    Obrigado pelo maravilhoso post, maravilhoso, parabéns!

    Deu certinho aqui no meu site, porém, tô batendo cabeça para adaptar a:

    http://www.meusite.com.br/site/embed/busca.php?consulta=ferragens

    Por gentileza, dar uma luz ae!

    Abç!

     
  113. Ola Elson

    Para o caso da busca, faça assim: http://www.meusite.com.br/site/embed/busca/?consulta=ferragens

    Busca aponta para o busca.php e as variáveis da pesquisa são via GET.

     
  114. bom estou com o seguinte erro:
    Fatal error: Cannot redeclare class Url in E:\cwva\class\URL.class.php on line 3

     
  115. Isso significa que você esta importando mais de uma vês a classe Url.

    Leia mais em:
    http://stackoverflow.com/questions/708140/php-fatal-error-cannot-redeclare-class

     
  116. opa!!! Eduardo, valew pela dica... ainda bem que vi este post antes... concordo com thia... melhor explicação msm...

     
  117. Criei o sistema que funciona perfeitamente a url amigável em browsers como Chrome, Firefox. Contudo nosso saudoso IE apresenta um problema que está me tirando do sério. hehehe

    É como se os estilos e js não importassem no IE. Já fiz a chamada dele via Método Url:getBase() da Classe Url que você disponibilizou. Utilizei os caminhos absolutos como você citou, porém, há uma quebra na estrutura do site... é como se o margin e padding não funcionem no IE. Alguma ideia?

     
  118. Algum caminho deve estar relativo.

     
  119. ola, gostaria de saber se por função q vc fez, é possivel eu pegar a quantidade de variaveis passada pelo get, obrigado!

     
  120. Faça assim:

    Veja como implementei a classe.

    <?php
    class Url
    {
        private static $url = null;
        private static $baseUrl = null;
    
        public static function length()
        {
            // Verifica se a lista de URL já foi preenchida
            if( self::$url == null )
                self::getURLList();
            // Retorna a quantidade de variáveis.
            return count( self::$url );
        } 
        public static function getBase()
        {
         .......
    

     
  121. cara funcionou perfeitamente, muito obrigado, e parabéns pelo post, DEUS te abençoe

     
  122. Olá Eduardo, você pode me ajudar, seguinte, baixei o exemplo 10000.zip, conforme vc disponibilizou e eu tentei rodar localmente na minha maquina, o endereço que esta é este; http://localhost/trabalharnanet/10000/, neste local está os arquivos: index.php, teste.php e o .htaccess, bom depois as pastas conforme o exemplo, o problema é que quando eu digito o endereço na url para acessar, ocorre esse erro; 500 Internal Server Error; Por varias pesquisa que eu fiz indicam que o erro é do arquivo .htaccess, na qual está desta maneira:

    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . index.php [L]
    Obs.: ja configurei o apache rewrite_module...

     
  123. O HTACCESS tem que usar as pastas.

    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /trabalharnanet/10000/index.php [L]
    http://localhost/trabalharnanet/10000/

     
  124. O colega, muitissimo obrigado, agora sim deu certo, meus parabéns pelo artigo, ficou ótimo, inclusive estou querendo adaptar um site com esse tipo de url, se for possivel gostaria de tirar mais uma duvida;

    Criei um arquivo chamo produto.php, junto com os outros dentro da pasta modulos;
    Criei um Link na pagina index.php junto com os outros igual aos demais; tipo;

    <p><a href="<?php echo URL::getBase(); ?>empresa">Empresa</a></p>
    bom dentro do arquivo empresa seria mais ou menos assim;
    <h2>Empresa</h2>
    <?php
        echo Url::getURL(1);
    
        $strSQL = "select codigo, descricao from produto where codigo = '$codigo' ";
        echo $strSQL;
    
    ?>
    O que eu queria saber é por exemplo se na url viesse desta maneira por exemplo:

    http://localhost/trabalharnanet/10000/empresa/520

    Onde o final seria por exemplo Tipo o ID/Codigo da SQL acima, ou seja, como eu poderia
    saber qual é o ultimo codigo da url... tipo Url::getURL(1),(2),(3)...

    não sei se consegui passar a duvida, mais um exemplo por exemplo;

    http://localhost/trabalharnanet/10000/empresa/anuncio/49

    Neste caso o id e ou Codigo que vai ser uma variavel da sql seria o 49, entao ja não mais seria
    Url::getURL(2);

     
  125. Use assim:

    <?php
        $codigo = Url::getURL(1);
    
        $strSQL = "select codigo, descricao from produto where codigo = '" . $codigo . "' ";
        .....
    
    ?>

     
  126. Boa noite, Eduardo poderia me ajudar?
    eu fiz o seu .htacess e utilizei seu código que por sinal é ótimo, só que não sei fazer a seguinte coisa:
    Quero fazer um site que acesse http://www.site.com.br/professor(aqui entra na pasta professor e pega o index, tudo sem mudar o index.php da página principal) depois utilizar o http://www.site.com.br/professor/nomedoprofessor(pasta tambem)/index.php
    e tudo aparecer na página principal via url amigavel, como faço isso utlizando esse código, me ajuda por favor.
    tenho que entregar esse trabalho e não consigo fazer!!
    Desde já lhe soug rato.

     
  127. Pelo que entendo você tem as pastas professor e dentro desta pasta tem uma pasta para cada professor cadastrado no seu ambiente?

    Se for isso mesmo, você no index da raiz terá que fazer um IF para verificar se a URL posição 0 (Url::getURL( 0 )) for igual a "professor" e a posição 1 for nula, direcione para a pasta professor.

    Caso a posição 1 for diferente de nulo direcione para a pasta do professor.

    <div id="principal">
    <?php
    $modulo = Url::getURL( 0 );
    
    if( $modulo == null )
        $modulo = "modulo1";
    
    if( $modulo == 'professor' )
    {
        if( Url::getURL( 1 ) != null )
        {
            if( file_exists( "professor/" . Url::getURL( 1 ) . "/index.php" ) )
                require "professor/" . Url::getURL( 1 ) . "/index.php";
            else
                echo 'Professor não localizado';
        }
        else
        {
            require "professor/index.php";
        }
    }
    
    if( file_exists( "modulos/" . $modulo . ".php" ) )
        require "modulos/" . $modulo . ".php";
    else
        require "modulos/404.php";
    ?>
    </div>

     
  128. Não sei nem como lhe agradecer!
    Muito obrigado mesmo, funcionou!!!
    Agradeço demais.

     
  129. Meu caro muuito obrigado por esse tutorial. Mais só tenho uma dúvida como faço pra aplicar esse sistema nas páginas sigle dinamicamente?
    Obrigado
    aguardo resposta valewww!

     
  130. Não esta funcionando no ie. nos outros navegadores esta tudo ok. O que estou fazendo de errado?

     
  131. Sim. Acabei de atualizar o POST por conta disso. A TAG <base/> não funciona no IE.

    Para resolver isso só usando URL absoluta sempre. Atualizei o POST para mostrar a solução.

     
  132. Fiz o que vc sugerio e realmente deu certo.
    Parabens pelo seu trabalho Eduardo, e principalmente obrigado pela disposição em me ajudar.

     
  133. Fala Eduardo, tudo bem?
    Primeiro gostaria de agradecer pela sua ajuda com url amigável na troca dos email. Agora sim, tirar minha dúvida contigo sobre falha da sua classe url amigável no internet explorer quando passar mais de um parâmetro.

     
  134. Problema comum..... Muiiito comum......

    <link rel="stylesheet" type="text/css" href="config/css/chosen.css" />
    A URL tem que ser absoluta sempre... Ou seja:
    <link rel="stylesheet" type="text/css" href="/config/css/chosen.css" />
    Simples assim.... Edita todos....

     
  135. Melhor explicação sobre URL Amigável que eu já vi.
    Parabéns!

     
  136. Fala Eduardo,
    Eu usei o seu código funcionou perfeitamente, só que o meu css fica desconfigurado. Sabe me dizer o motivo desse erro?

     
  137. Conforme troca de e-mail esta tudo resolvido.

     
  138. Conforme troca de e-mail, o erro era por causa do não uso de URL absoluta nos links para o CSS.

    Sempre utilize URL absolutas para os CSS, como:

    <link rel="stylesheet" type="text/css" href="/css/style.css"/>

     
  139. Muito bom, parabéns Eduardo.

     
  140. Muito bom o artigo, foi bem explicado e fácil de usar.

    Parabéns Eduardo.

     
  141. Estou com um problema, funciona direito mas se um usuário tentar colocar a extensão .php ou .html no final do arquivo gera um erro. Por exemplo: minha url ficou http://www.meusite.com.br/artigos
    mas caso alguem coloque: http://www.meusite.com.br/artigos.php vem esse erro: Fatal error: Class 'URL' not found in
    Como posso redirecionar para uma página caso alguem coloque qualquer extensão no final?

    Obrigado!!!

     
  142. Isso acontece porque o usuário acessa direto os arquivos PHP sem passar pelo index.php

    Você resolve fácil criando uma pasta e colocando as páginas dentro desta pasta.

     
  143. Amigão um favor mi ajuda serio mesmo eu tenho um site e quero saber como posso arrumar o titulo das postagens e as urls dele esta muito ruin para o google

    tipo eu queria assim o

    O tipo que eu quero:
    http://www.meusite.net/reader/naruto/596

    e assim que esta :
    http://www.meusite.net/reader/read/naruto/pt-br/0/596/page/1

    e o titulo esta assim o:
    ??? :: ???? 000 :: meu site

    ajuda ai por favor

     
  144. como faço para fazer isto no Mac? "Se você estiver usando MAC, este arquivo se tornará oculto. Para visualizá-lo use ls -a." obrigado

     
  145. Para visualizar o .htaccess no mac, no console digite ls -a.

    Para editar eu uso o NANO...

    nano .htaccess e mesmo ele estando oculto ele estará disponível para edição.

     
  146. Sho de bola. mas numa situação "localhost/teste/news.php?exibir=exibir&anoticia=Fruta+de+Caixinha&n=30"

    como poderia tratar?

     
  147. Então, tens o módulo news, com o método exibir. Então sua URL fica:

    http://seusite.com.br/news/exibir/Fruta+de+Caixinha

     
  148. Obrigado pela artigo e simplicidade como você trata o assunto, muitos lugares pintam como bicho de 7 cabeças.

    Vlw,
    Marcelo

     
  149. Obrigado pelo comentário.