URL Amigáveis em PHP.
Posted in php on February 9th, 2009 by Edipo Luis Fderle – Be the first to commentWarning: Missing argument 1 for GeSHi::GeSHi(), called in /home/storage/f/73/ab/bitside1/public_html/edipo_blog/blog/wp-content/plugins/codecolorer/codecolorer-core.php on line 137 and defined in /home/storage/f/73/ab/bitside1/public_html/edipo_blog/blog/wp-content/plugins/deans_code_highlighter/geshi.php on line 432
Warning: Missing argument 2 for GeSHi::GeSHi(), called in /home/storage/f/73/ab/bitside1/public_html/edipo_blog/blog/wp-content/plugins/codecolorer/codecolorer-core.php on line 137 and defined in /home/storage/f/73/ab/bitside1/public_html/edipo_blog/blog/wp-content/plugins/deans_code_highlighter/geshi.php on line 432
Suponha que você tenha um script como posts.php na raiz de seu site, então temos uma URL como esta: http://www.yoursite.com/blog.php. Tal página é utilizada para exibir os posts, o post em questão é encontrado sendo passado dois paramentros para a URL, cat(category) e id.
Com base nisso temos o acesso a um certo post digamos o terceiro post que foi gravado no banco acessando a seguinte URL: http://youtsite.com/blog.php?id=3.
Bem essa é a forma como muitos o fazem, mas existem alguns problemas com isso, não problema de execução, isso funciona corretamente, alguns problemas são: esse tipo de URL é MAL indexada pelos sistemas de busca( leia-se Google), esse tipo de URL é aquelas que o fazem dizer “Eca, isso é feio.”, bem isto não é tão feio, você pode encontra algo ainda mais feio, assim:
http://www.example.com/index/Y29udGVudD1vdXRwdXRfbGlzdCZhY3Rpb249c2V0YXJyYXk==
Uma maneira de melhorar isso seria usar uma URL no seguinte estilo:
http://yoursite.com.br/blog/web/1/
ou
http://yoursite.com.br/posts/web/how_write_a_book/
Habilitando o suporte a Rewrite.
Aqui creio eu reside umas das desvantagens de se usar o Rewrite, localmente não temos problemas com isso pois temos total acesso aos arquivos de configuração do apache, já a história muda quando se trata do servidor remoto, onde você hospeda se código, muitos servers não tem essa opção habilidade, alguns após o pedido podem liberar isso para você outros não, com isso em mente vamos seguir em frente.
Para habilitar o suporte você deve acessar o arquivo /etc/apache2/sites-enabled/000-default
Irá ter um trecho igual a esse:
1 <Directory /var/www/>
2 Options Indexes FollowSymLinks MultiViews
3 AllowOverride None
4 Order allow,deny
5 allow from all
6 </Directory>
Mude para
1 <Directory /var/www/>
2 Options Indexes FollowSymLinks MultiViews
3 AllowOverride All
4 Order allow,deny
5 allow from all
6 </Directory>
Isso serve para habilitar o suporte a links simbolicos, e agora habilite o Rewrite assim:
a2enmod rewrite && sudo invoke-rc.d apache2 restart
Pronto se os passos acima derem certo, esta feito.
O Arquivo .htaccess
Para começar sim, esse é um arquivo somente com extesão, segundo, é nele que vamos dizer que queremos o Rewrite habilidato e onde iremos escrever as nossas regrar para “reescrita” das urls.
Nosso .htaccess ficaria como isto:
1 2 3 | <strong>RewriteEngine on RewriteBase /blog RewriteRule posts/([a-zA-Z\\s]+)\/([0-9]*)/(.*)$ post.php?cat=$1&id=$2&nome=$3</strong> |
Para nosso exemplo iriamos ter algo assim no .htaccess, explicando melhor o que acontece ai:
Linha 1: “ligamos” o Modo Rewrite. Linha 2: Dizemos que a base te todo o conteudo será em /blog
Na linha 3 é onde reside a nossa lógica de reescrita da url, como você pode notar temos uma expressão regular ai, vamos entender um pouco o que ela faz:
posts/ quer dizer que tudo que começar com posts/ irá usar esse nossa expressão, então seguimos com ela e temos ([a-zA-Z\\s]+) aqui dizemos que queremos somente letras e espaços em branco, ([0-9]*) aqui somente numeros, e por fim qualquer coisa.
Essa explicação foi muito superficial e é provavel que você não tenha entendido caso nunca viu uma expressao regular na frente, para isso ao final desse post irá ter alguns links contendo alguns sobre ER.
então dizemos que qualquer ocorrencia de um “string” contendo algo que case com a expressao deve ser “lido” como post.php?cat=$1&id=$2&nome=$3.
Ops que diabos são esses $1, $1, $1, o que esta entre os parenteses está sendo “guardado” nessas variaveis, o que nos leva a conclusão que SIM agora podemos acessar essas váriaveis atráves do método $_GET.
Bom basicamente é isso, abaixo segue um exemplo do uso da URL como descrito acima, é apenas uma demostração caso você queira testar ai, os códigos abaixo consistem em um exemplo onde são apresentados dois links como se fosse um “blog”, esta usando Mysql para puxar os dados de exemplo, creio que com isso irá dar para ter um idéia e para você ir fazendo uns testes em cima dele, então lá vai:
list.php
1 <?
2 require “connet_db.php“;
3 echo “<h1>List Posts</h1>“;
4 $posts = mysql_query(“SELECT * FROM posts“);
5
6 $linhas = mysql_num_rows($posts);
7
8 if (!$posts) {
9 echo ‘Não foi possivel executar a consulta: ‘ . mysql_error();
10 exit;
11 }
12 for($i=0; $i < $linhas; $i++){
13
14 $dado = mysql_fetch_row($posts);
15 echo “<p><a href=\”/blog/posts/$dado[2]/$dado[0]/$dado[1] \”> $dado[1] </a></p>“;
16
17 }
18
19?>
post.php
1 <?
2 require “connet_db.php“;
3
4 $request = $_SERVER['REDIRECT_URL'];
5
6 echo “Category = “, $_GET['cat'];
7 echo “<br>“;
8 echo “ID = “, $_GET['id'];
9 echo “<br>“;
10
11 $cat = $_GET['cat'];
12 $id = $_GET['id'];
13 $nome = $_GET['nome'];
14
15 $consulta = mysql_query(“SELECT * FROM posts WHERE category=’$cat‘ and id=’$id‘ “);
16
17
18 $linhas = mysql_num_rows($consulta);
19
20 if (!$consulta) {
21 echo ‘Não foi possivel executar a consulta: ‘ . mysql_error();
22 exit;
23 }
24 for($i=0; $i < $linhas; $i++){
25 $dado = mysql_fetch_row($consulta);
26 echo “<p><b>Title:</b>“, $dado[1], “</p>“;
27 echo “<p><b>Catgory:</b>“, $dado[2], “</p>“;
28 echo “<p><b>Body:</b>“, $dado[3], “</p>“;
29 }
30
31 echo “Vejamos temos um array da URL, você pode usar ele para cirar seus links, ou se preferir use o GET como feito acima“;
32 $parts = explode(‘/‘, $request);
33 array_shift($parts); // deleta o primeiro elemento do array pois é sempre vazio
34
35 echo“<pre>“;
36 print_r($parts);
37 echo “</pre>“;
38
39
40 ?>
Tá ai o exemplo, obviamente falta a arquivo de conexao com o banco de dados, abaixo tem um link para baixar todos os arquivos do exemplo. Bom é isso espero que venha a ser útil para alguem. Até a próximo.
OBS : Perdoem a falta de identação do código mas o wordpress que faz isso(as vezes)
