<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Bruno Torres ponto netmod_rewrite &#187; Bruno Torres ponto net</title>
	<atom:link href="http://brunotorres.net/tag/mod_rewrite/feed" rel="self" type="application/rss+xml" />
	<link>http://brunotorres.net</link>
	<description>Textos infreqÃ¼entes sobre a web</description>
	<lastBuildDate>Thu, 24 Mar 2011 05:54:38 +0000</lastBuildDate>
	<language>pt-br</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>BFUT.net no ar</title>
		<link>http://brunotorres.net/bfutnet-no-ar</link>
		<comments>http://brunotorres.net/bfutnet-no-ar#comments</comments>
		<pubDate>Wed, 09 Nov 2005 05:02:57 +0000</pubDate>
		<dc:creator>Bruno Torres</dc:creator>
				<category><![CDATA[apache]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[gnulinux]]></category>
		<category><![CDATA[htaccess]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[internet]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[mod_rewrite]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://brunotorres.net/?p=110</guid>
		<description><![CDATA[Como jÃ¡ havia dito, fiquei algum tempo sem postar por aqui pois estava finalizando um site e, como o prazo era curto, isso estava consumindo quase todo meu tempo. PorÃ©m, finalmente coloquei o site no ar. Se chama BFUT.net. BFUT Ã© um instituto que ensina aos americanos tÃ©cnicas de futebol brasileiro e surgiu da incorporaÃ§Ã£o [...]]]></description>
			<content:encoded><![CDATA[<p>Como jÃ¡ havia dito, fiquei algum tempo sem postar por aqui pois estava finalizando um site e, como o prazo era curto, isso estava consumindo quase todo meu tempo.<!--<a id="gotocontentlink" href="#post-content">Pular anúncios</a>--><div class="adpostsearch">
<div>
<script type="text/javascript"><!--
google_ad_client = "pub-6502782542223555";
/* adPostSearch */
google_ad_slot = "4051981144";
google_ad_width = 336;
google_ad_height = 280;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
</div></div><!--<a name="post-content"></a>-->

<p>PorÃ©m, finalmente coloquei o site no ar. Se chama <a href="http://www.bfut.net">BFUT.net</a>. BFUT Ã© um instituto que ensina aos americanos tÃ©cnicas de futebol brasileiro e surgiu da incorporaÃ§Ã£o de uma empresa chamada BRUSA (cujo site eu tambÃ©m havia desenvolvido) pela <a href="http://www.traffic.com.br/">Traffic Sports</a>, conhecida empresa de marketing esportivo, atuante no Brasil, AmÃ©rica Latina e Estados Unidos.</p>
<p>O layout foi criado pelo <a href="http://tableless.com.br/eyesmiles/">Diego Eis</a> e implementado por nÃ³s dois. Na verdade, o markup (XHTML Strict, enviado como HTML) foi todo desenvolvido por mim e o CSS parte por mim  parte por ele.</p>
<p>O mais interessante no desenvolvimento desse site foi ter sofrido a pior ameaÃ§a que um desenvolvedor web pode sofrer: o site precisaria ser hospedado em um servidor <acronym title="Internet Information Services">IIS</acronym>. SÃ©rio, pare e pense. Em um servidor IIS nÃ£o hÃ¡ arquivos <a href="http://httpd.apache.org/docs/2.0/howto/htaccess.html">.htaccess</a>, o mais prÃ³ximo que se pode chegar da funcionalidade do <a href="http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html">mod_rewrite</a> Ã© usando alguma ferramenta de terceiros como o <a href="http://isapirewrite.com/">ISAPI Rewrite</a> (que faz um trabalho minimamente decente, nada mais que isso) e em um servidor windows nÃ£o hÃ¡ acesso <a href="http://www.ssh.com/">SSH</a>. Ou seja, Ã© como capar o pobre desenvolvedor. Dizer a ele que nunhuma das ferramentas que tornam a vida dele mais fÃ¡cil podem ser usadas.</p>
<p>Felizmente o administrador dos servidores nÃ£o era lÃ¡ muito Ã­ntimo do PHP e MySQL (pelo menos nÃ£o no IIS) e, depois de interminÃ¡veis tentativas de fazer o negÃ³cio funcionar, decidiu por me entregar um servidor linux, com apache, PHP, MySQL e liberdade pra instalar qualquer ferramenta e fazer qualquer configuraÃ§Ã£o que fosse necessÃ¡ria. Respirei aliviado.</p>
<p>A parte triste Ã© que, a essa altura, eu jÃ¡ havia desistido de usar o <a href="http://cakephp.org/">CakePHP</a>, jÃ¡ que ele nÃ£o roda lÃ¡ muito bem no servidorzinho meia-boca da empresa do tio (seu, nÃ£o meu) Gates. O cake Ã© um framework <acronym title="Model View Controller">MVC</acronym>, fortemente baseado na estrutura do <a href="http://rubyonrails.com">Ruby on Rails</a>, que facilita muito a vida do programador, aumenta a produtividade e ajuda a criar um cÃ³digo mais limpo e fÃ¡cil de manter (estou investigando atualmente o <a href="http://www.symfony-project.com/">Symfony</a>, que parece ser muito interessante tambÃ©m).</p>
<p>Mas, apesar dos pesares, o site estÃ¡ no ar e eu fiquei bastante satisfeito com o resultado (e, felizmente, o cliente tambÃ©m <img src='http://brunotorres.net/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> ). Criei um <acronym title="Content Management System">CMS</acronym> simples para que o prÃ³prio cliente possa gerenciar com facilidade o conteÃºdo do site.</p>
<p>Usei o <a href="http://www.themaninblue.com/experiment/widgEditor/">WidgEditor</a>, um excelente editor HTML feito pelo <a href="http://www.themaninblue.com/">Cameron Adams</a> que, apesar de ostentar a assustadora sigla <acronym title="What You See Is What You Get">WYSIWYG</acronym> em sua descriÃ§Ã£o, gera um markup limpo e, ao menos pelo que pude ver atÃ© agora, vÃ¡lido. Ã‰ fÃ¡cil de customizar e muito simples de usar pelo usuÃ¡rio leigo (desde que vocÃª diga a ele em letras maiÃºsculas com negrito e itÃ¡lico, para nÃ£o colar texto copiado direto do Word dentro da Ã¡rea de ediÃ§Ã£o). Aquele papinho que ouvimos por aÃ­ de que nÃ£o Ã© possÃ­vel gerar HTML vÃ¡lido porque os editores nÃ£o entendem da linguagem pode ser classificado de uma vez por todas de &#8220;bullshit&#8221;. Um elemento SCRIPT no HEAD do HTML e uma class=&#8221;widgEditor&#8221; em qualquer TEXTAREA e pronto.</p>
<p>Acho que nÃ£o hÃ¡ muito o que falar sobre o cÃ³digo do site. XHTML simples, CSS, nenhuma tÃ©cnica muito avanÃ§ada de marcaÃ§Ã£o ou estilo. Simplesmente o bom e velho feijÃ£o com arroz, que Ã© a melhor opÃ§Ã£o em 99% dos casos. O menu dropdown foi feito usando o <a href="http://www.alistapart.com/articles/dropdowns/">Suckerfish</a>, que funciona 100% via CSS nos browsers e via um pequeno script javascript naquele negÃ³cio que atende pelo nome de Internet Explorer.</p>
<p>Por agora Ã© isso. O site estÃ¡ no ar e eu gostaria de ouvir os comentÃ¡rios de vocÃªs. Fiquem Ã  vontade.</p>
<div id="crp_related"><h3>Leia tambÃ©m:</h3><ul><li><a href="http://brunotorres.net/tabelas-estilo-zebra" rel="bookmark" class="crp_title">Tabelas estilo &#8220;zebra&#8221;</a></li><li><a href="http://brunotorres.net/evitando-caching-css" rel="bookmark" class="crp_title">Evitando caching ao atualizar arquivos CSS</a></li><li><a href="http://brunotorres.net/urls" rel="bookmark" class="crp_title">Gerenciamento de URLs &#8211; Criando URLs amigÃ¡veis</a></li><li><a href="http://brunotorres.net/seguindo-padroes" rel="bookmark" class="crp_title">Seguindo Ã  risca os padrÃµes</a></li><li><a href="http://brunotorres.net/xhtml-pensando-no-futuro" rel="bookmark" class="crp_title">XHTML: pensando no futuro?</a></li><li><a href="http://brunotorres.net/preco-erro" rel="bookmark" class="crp_title">O preÃ§o de um erro</a></li><li><a href="http://brunotorres.net/urls-php" rel="bookmark" class="crp_title">Gerenciamento de URLs com PHP</a></li><li><a href="http://brunotorres.net/novo-estilo-style-switcher" rel="bookmark" class="crp_title">Novo layout e style switcher</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://brunotorres.net/bfutnet-no-ar/feed</wfw:commentRss>
		<slash:comments>19</slash:comments>
		</item>
		<item>
		<title>Redirecionando seu feed para o Feedburner</title>
		<link>http://brunotorres.net/redirecionar-feed-feedburner</link>
		<comments>http://brunotorres.net/redirecionar-feed-feedburner#comments</comments>
		<pubDate>Thu, 13 Oct 2005 02:34:38 +0000</pubDate>
		<dc:creator>Bruno Torres</dc:creator>
				<category><![CDATA[apache]]></category>
		<category><![CDATA[atom]]></category>
		<category><![CDATA[feedburner]]></category>
		<category><![CDATA[feeds]]></category>
		<category><![CDATA[http]]></category>
		<category><![CDATA[mod_rewrite]]></category>
		<category><![CDATA[rss]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://brunotorres.net/?p=96</guid>
		<description><![CDATA[Recebi alguns emails e comentÃ¡rios sobre o Ãºltimo post de pessoas com dificuldade para configurar o redirecionamento dos seus feeds atuais para o feedburner. [update] Se vocÃª usa WordPress, pode usar o WordPress Feedburner Plugin. Eu nÃ£o testei, mas pelo que li parece que ele faz todo o trabalho sujo pra vocÃª. Se alguÃ©m tiver [...]]]></description>
			<content:encoded><![CDATA[<p>Recebi alguns emails e comentÃ¡rios sobre o <a href="http://brunotorres.net/2005/10/09/feedburner-estatisticas-economia-de-banda-e-um-trato-no-visual-dos-seus-feeds" title="Feedburner: estatÃ­sticas, economia de banda e um trato no visual dos seus feeds">Ãºltimo post</a> de pessoas com dificuldade para configurar o redirecionamento dos seus feeds atuais para o <a href="http://feedburner.com/">feedburner</a>.<!--<a id="gotocontentlink" href="#post-content">Pular anúncios</a>--><div class="adpostsearch">
<div>
<script type="text/javascript"><!--
google_ad_client = "pub-6502782542223555";
/* adPostSearch */
google_ad_slot = "4051981144";
google_ad_width = 336;
google_ad_height = 280;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
</div></div><!--<a name="post-content"></a>-->

<p><strong>[update]</strong><br />
Se vocÃª usa <a href="http://wordpress.org/">WordPress</a>, pode usar o <a href="http://orderedlist.com/articles/wordpress-feedburner-plugin/">WordPress Feedburner Plugin</a>. Eu nÃ£o testei, mas pelo que li parece que ele faz todo o trabalho sujo pra vocÃª. Se alguÃ©m tiver testado, por favor, me conte como Ã© e eu posto aqui.</p>
<p><strong>[update2]<br />
</strong> Atualizei o post pra dizer que, se vocÃª usa o wordpress e nÃ£o estÃ¡ afim de usar o plugin citado acima, vocÃª tem que colocar qualquer regra de reescrita deste artigo <strong>antes</strong> das regras do wordpress. Da seguinte forma, por exemplo:</p>
<pre>
RewriteEngine On
RewriteCond %{HTTP_USER_AGENT} !feedBurner <strong>[NC]</strong>
RewriteRule ^feed/?$ http://feeds.feedburner.com/meufeed [R=302,L]
RewriteEngine Off
<strong># BEGIN WordPress </strong>
</pre>
<p>Se as regras forem colocadas depois das do wordpress, ele simplesmente vai aplicar as regras dele e finalizar a reescrita, sem nem ao menos ler as regras que vocÃª fez.</p>
<p>Outro motivo para o update Ã© que Ã© interessante fazer a checagem do <em lang="en">user agent</em> de forma que seja ignorada a caixa das letras. Ou seja, usando o <strong>[NC]</strong>, como acima.<br />
<strong>[/update2]</strong></p>
<p>E para os usuÃ¡rios de <a href="http://www.sixapart.com/movabletype/">Movable Type</a> tambÃ©m tem um <a href="http://www.rayners.org/plugins/feedburner/">plugin</a>. Acho que a <a href="http://simonevb.com/">Simone</a> estÃ¡ usando e, pelo jeito, estÃ¡ funcionando muito bem.<br />
<strong>[/update]</strong></p>
<p>Como eu disse, para fazer esse tipo de coisa, Ã© necessÃ¡rio pelo menos um mÃ­nimo de conhecimento sobre HTTP. VocÃª precisa saber manipular redirecionamentos e verificar User Agents seja pelo seu servidor HTTP, seja por alguma linguagem que rode no servidor.</p>
<p>Como vejo que hÃ¡ muitas pessoas com dÃºvidas sobre isso, vou explicar rapidamente como configurar os tais redirecionamentos.</p>
<p>Vou usar trÃªs hipÃ³teses e dar a soluÃ§Ã£o para cada uma delas: feeds estÃ¡ticos, feeds dinÃ¢micos acessados por uma URL <em>sem</em> query string (variÃ¡veis na URL, do tipo ?var1=valor1&#038;var2=valor2) e feeds dinÃ¢micos <em>com</em> query string.</p>
<h3>Feeds estÃ¡ticos</h3>
<p>Feeds estÃ¡ticos sÃ£o meros arquivos em XML plano, que podem ser acessados via uma URL que reflita sua posiÃ§Ã£o no sistema de arquivos abaixo da <em>root</em> do site ou por alguma <a href="http://www.brunotorres.net/2004/08/09/urls">URL customizada</a>, seja por meio de <a href="http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html">mod_rewrite</a>, <a href="http://www.brunotorres.net/2005/03/19/urls-php" title=" Gerenciamento de URLs com PHP">PHP</a> ou algum outro meio.</p>
<p>Vamos ver como proceder nos dois casos.</p>
<p>Para o nosso exemplo, vamos imaginar um arquivo chamado <em>feed.xml</em>, localizado na raiz do seu site. Normalmente ele pode ser acessado pela URL http://seusite.com/feed.xml.</p>
<p>Vamos assumir tambÃ©m que a URL do novo feed gerado no feedburner seja http://feeds.feedburner.com/meufeed.</p>
<p>Nesse caso, hÃ¡ duas maneiras de vocÃª fazer com que seus leitores continuem acessando a url dentro do seu site e sejam redirecionadas para o feedburner: mantendo o mesmo arquivo e verificando o user agent ou mudando o nome do arquivo.</p>
<p>Se vocÃª mudar o nome do arquivo, a coisa se simplifica. Nesse caso o mod_rewrite nem Ã© necessÃ¡rio. Por exemplo, se seus usuÃ¡rios acessam /feed.xml, voce pode trocar o nome desse arquivo pra feed-fb.xml, usar essa URL no feedburner e redirecionar a URL que seus usuÃ¡rios acessam com uma regra de redirecionamento (<a href="http://httpd.apache.org/docs/2.0/mod/mod_alias.html">mod_alias</a>):</p>
<pre>Redirect /feed.xml http://feeds.feedburner.com/meufeed</pre>
<p>Note que o <em>arquivo</em> feed.xml nÃ£o existe mais. O que hÃ¡ agora Ã© uma URL, /feed.xml, que simplesmente redireciona para um outro local.</p>
<p>Se vocÃª mantiver o arquivo com o mesmo nome, o que vocÃª precisa fazer Ã© apenas incluir as linhas abaixo no seu arquivo <a href="http://httpd.apache.org/docs/2.0/howto/htaccess.html">.htaccess</a>, na raiz do site (no mesmo diretÃ³rio onde estÃ¡ o feed):</p>
<pre id="rewritestatic">RewriteEngine On
RewriteCond %{HTTP_USER_AGENT} !feedBurner [NC]
RewriteRule ^feed\.xml$ http://feeds.feedburner.com/meufeed [R=302,L]</pre>
<p>Isso significa: se o user agent nÃ£o for o feedburner, ao receber uma requisiÃ§Ã£o para feed.xml, redirecione para http://feeds.feedburner.com/meufeed. Esse redirecionamento Ã© temporÃ¡rio (R=<a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.3.3">302</a>), e essa regra deve ser a Ãºltima a ser processada (L), ou seja, qualquer regra abaixo desta deve ser ignorada.</p>
<p>A primeira linha Ã© necessÃ¡ria porque o feedburner precisa continuar tendo acesso Ã  URL original, e nÃ£o ser redirecionado pra si mesmo.</p>
<p>Agora, imaginemos que o seu feed (feed.xml) seja acessado pela url <em>http://seusite.com/feed</em> de acordo com uma regra de reescrita, como a abaixo:</p>
<pre>RewriteRule ^feed\/?$ /feed.xml</pre>
<p>Os usuÃ¡rios devem continuar acessando essa URL (/feed) e ser redirecionados para a nova, no feedburner. Para isso, use uma regra bem parecida com a primeira:</p>
<pre>RewriteCond %{HTTP_USER_AGENT} !feedBurner [NC]
RewriteRule ^feed\/?$ http://feeds.feedburner.com/meufeed [R=302,L]

RewriteRule ^feed\/?$ /feed.xml</pre>
<p>Ou seja, qualquer um, menos o feedburner, vai ser redirecionado. Acho que vocÃª jÃ¡ pegou a idÃ©ia, nÃ©? Que bom&#8230;</p>
<h3>Feeds dinÃ¢micos sem query string</h3>
<p>Mesmo que o seu feed seja dinÃ¢mico, leia a parte acima, sobre feeds estÃ¡ticos, para entender como funciona o esquema do redirecionamento. A mÃ¡gica com os arquivos dinÃ¢micos Ã© exatamente a mesma.</p>
<p>Digamos que o seu feed se chame feed.php e esteja localizado na raiz do seu site. E a URL do feed no feedburner Ã© a mesma que usamos acima.</p>
<p>No caso de vocÃª fornecer a seus leitores a url com a localizaÃ§Ã£o do arquivo PHP (http://seusite.com/feed.php), use a seguinte regra:</p>
<pre>RewriteCond %{HTTP_USER_AGENT} !feedBurner [NC]
RewriteRule ^feed\.php$ http://feeds.feedburner.com/meufeed [R=302,L]</pre>
<p>A explicaÃ§Ã£o Ã© a mesma dada <a href="#rewritestatic">acima</a>.</p>
<p>No caso de vocÃª fornecer uma URL customizada, como por exemplo http://seusite.com/feed, use a regra:</p>
<pre>RewriteCond %{HTTP_USER_AGENT} !feedBurner [NC]
RewriteRule ^feed\/?$ http://feeds.feedburner.com/meufeed [R=302,L]

RewriteRule ^feed\/?$ /feed.php</pre>
<p>Ou seja, funciona da mesma forma que quando o feed Ã© estÃ¡tico. Mas, como eu sei que vÃ£o perguntar, acho que  pecar por excesso nÃ£o Ã© o pior dos pecados <img src='http://brunotorres.net/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> .</p>
<h3>Feeds dinÃ¢micos com query string</h3>
<p>Vou usar o exemplo do nosso amigo <a href="http://www.winajuda.com/">Rodrigo Ghedin</a>. O feed do site dele tem uma URL que consiste do nome de um arquivo PHP mais uma query string. A URL Ã© <em>http://winajuda.com/news/rss.php?f=view</em>. E qual o problema com isso? Bem, o mod_rewrite nÃ£o intercepta a query string. Ou seja, se vocÃª reescreve um arquivo rss.php para, por exemplo, feed.rss, este Ãºltimo aceitaria normalmente as query strings na URL. Ou seja, vocÃª precisaria acessar por /feed.rss?f=view.</p>
<p>Trocando em miÃºdos, se vocÃª usar</p>
<pre>RewriteRule ^rss\.php$ http://feeds.feedburner.com/meufeed [R=302,L]</pre>
<p>e acessasse http://seusite.com/rss.php?f=view, vocÃª seria redirecionado para a URL do feedburner, com a query string no fim. Assim: http://feeds.feedburner.com/meufeed?f=view.</p>
<p>Isso nÃ£o causa problemas, na verdade, mas fica um pouco estranho. Esse caso nÃ£o Ã©, na verdade, o melhor para demonstrar o problema com as query strings mas, se vocÃª tem algum caso em que vÃ¡rias variÃ¡veis sejam passadas pela query string e isso nÃ£o possa ser mudado, saiba que o mod_rewrite nÃ£o Ã© muito seu amigo nesse caso. VocÃª nÃ£o pode fazer, por exemplo:</p>
<pre>RewriteRule ^rss\.php\?f=view$ http://feeds.feedburner.com/meufeed [R=302,L] #isso Ã© errado</pre>
<p>Isso nÃ£o vai funcionar. A melhor maneira de resolver isso Ã©, com certeza, no prÃ³prio PHP. E Ã© muito simples.</p>
<p><strong>[update]</strong><br />
Estive discutindo sobre isso com o <a href="http://digitalminds.com.br/">Danilo</a> hoje e ele me mostrou um <a href="http://www.zeroeffort.com/79/site-content/rewritingurls.html">texto</a> que mostra como lidar com query strings com mod_rewrite. No caso do nosso exemplo, a regra seria assim:</p>
<pre>RewriteCond %{HTTP_USER_AGENT} !feedBurner [NC]
RewriteCond %{QUERY_STRING} ^f=view$
RewriteRule ^rss\.php$ http://feeds.feedburner.com/meufeed? [R=302,L]</pre>
<p><strong>[/update]</strong></p>
<p>Continuando a usar o exemplo do Ghedin, ele precisa apenas colocar algumas linhas no inÃ­cio do arquivo rss.php:</p>
<pre><code>&lt;?php
$ua = $_SERVER[&#39;HTTP_USER_AGENT&#39;];
if ((isset($_GET[&#39;f&#39;])) &#038;&#038;
&#160;&#160;($_GET[&#39;f&#39;] == &#39;view&#39;) &#038;&#038;
&#160;&#160;(! eregi(&#39;feedburner&#39;, $ua)))
&#160;&#160;{
&#160;&#160;&#160;&#160;header(&#34;Location: http://feeds.feedburner.com/meufeed&#34;);
&#160;&#160;&#160;&#160;exit; # so pra garantir que nÃ£o continue a execuÃ§Ã£o
&#160;&#160;}
?&gt;</code></pre>
<p>Simples assim. Acho que nÃ£o Ã© necessÃ¡rio explicar as linhas acima, assumindo que vocÃª entenda pelo menos um pouco de PHP.</p>
<p>Bom, Ã© isso. Acho que com esse texto vocÃª tem o bÃ¡sico para brincar com redirecionamentos. Mas, lembre-se, HTTP Ã© a base da web. VocÃª precisa entendÃª-lo pelo menos um pouco. Portanto, vale a pena dar uma estudada sobre o assunto. Uma <a href="http://www.google.com.br/search?q=http+explained">busca no google</a> Ã© um bom comeÃ§o. <img src='http://brunotorres.net/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<div id="crp_related"><h3>Leia tambÃ©m:</h3><ul><li><a href="http://brunotorres.net/feedburner-estatisticas-economia-de-banda-e-um-trato-no-visual-dos-seus-feeds" rel="bookmark" class="crp_title">Feedburner: estatÃ­sticas, economia de banda e um trato no visual dos seus feeds</a></li><li><a href="http://brunotorres.net/feedburner-baguncando-caracteres-especiais-em-utf-8" rel="bookmark" class="crp_title">Feedburner bagunÃ§ando caracteres especiais em UTF-8</a></li><li><a href="http://brunotorres.net/como-saber-a-quantidade-de-assinantes-de-um-feed-no-google-reader" rel="bookmark" class="crp_title">Como saber a quantidade de assinantes de um feed no Google Reader</a></li><li><a href="http://brunotorres.net/como-mostrar-a-quantidade-de-assinantes-de-um-feed-no-seu-blog" rel="bookmark" class="crp_title">Como mostrar a quantidade de assinantes de um feed no seu blog</a></li><li><a href="http://brunotorres.net/mudancas-no-servico-browserfriendly-do-feedburner" rel="bookmark" class="crp_title">MudanÃ§as no serviÃ§o &#8220;BrowserFriendly&#8221; do FeedBurner</a></li><li><a href="http://brunotorres.net/urls-again" rel="bookmark" class="crp_title">URLs amigÃ¡veis &#8211; esclarecendo dÃºvidas</a></li><li><a href="http://brunotorres.net/atualizar-comentarios-sem-atualizar-feed" rel="bookmark" class="crp_title">Atualizando a quantidade de comentÃ¡rios sem atualizar o feed</a></li><li><a href="http://brunotorres.net/feed-do-happy-tree-friends-de-volta" rel="bookmark" class="crp_title">Feed do Happy Tree Friends de volta</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://brunotorres.net/redirecionar-feed-feedburner/feed</wfw:commentRss>
		<slash:comments>20</slash:comments>
		</item>
		<item>
		<title>Evitando caching ao atualizar arquivos CSS</title>
		<link>http://brunotorres.net/evitando-caching-css</link>
		<comments>http://brunotorres.net/evitando-caching-css#comments</comments>
		<pubDate>Mon, 30 May 2005 15:36:12 +0000</pubDate>
		<dc:creator>Bruno Torres</dc:creator>
				<category><![CDATA[apache]]></category>
		<category><![CDATA[caching]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[htaccess]]></category>
		<category><![CDATA[mod_rewrite]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Uma das grandes vantagens de se usar CSS para definir a camada de apresentaÃ§Ã£o (layout) de um site Ã© o fato de que os arquivos CSS sÃ£o guardados no cache do browser na primeira vez em que sÃ£o carregados, evitando assim a necessidade de baixar o arquivo toda vez que se acessa o site. Mas [...]]]></description>
			<content:encoded><![CDATA[<p>Uma das grandes vantagens de se usar CSS para definir a camada de apresentaÃ§Ã£o (layout) de um site Ã© o fato de que os arquivos<br />
CSS sÃ£o guardados no cache do browser na primeira vez em que sÃ£o carregados, evitando assim a necessidade de baixar o arquivo<br />
toda vez que se acessa o site.<!--<a id="gotocontentlink" href="#post-content">Pular anúncios</a>--><div class="adpostsearch">
<div>
<script type="text/javascript"><!--
google_ad_client = "pub-6502782542223555";
/* adPostSearch */
google_ad_slot = "4051981144";
google_ad_width = 336;
google_ad_height = 280;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
</div></div><!--<a name="post-content"></a>-->

<p>Mas isso causa um problema: se vocÃª fizer alguma modificaÃ§Ã£o no CSS, o browser sÃ³ vai baixar a nova versÃ£o do arquivo se vocÃª der<br />
um reload (F5, em geral). Isso Ã© muito chato e pode &#8220;quebrar&#8221; totalmente o layout de uma determinada pÃ¡gina se forem feitas<br />
modificaÃ§Ãµes tambÃ©m no (X)HTML.</p>
<p>Vejamos como esse problema pode ser resolvido.</p>
<p>Uma soluÃ§Ã£o seria trocar o nome do arquivo CSS. Bom, mas trocar o nome do arquivo nÃ£o Ã© lÃ¡ uma soluÃ§Ã£o muito boa. Imagine um site com 100 pÃ¡ginas (X)HTML estÃ¡ticas. Se vocÃª<br />
trocar o nome do arquivo CSS, vai ser obrigado a editar todos os (X)HTML para trocar o nome do CSS no link ou style e<br />
subir todos os arquivos pro servidor. No caso de um site dinÃ¢mico com um template para todas as pÃ¡ginas o trabalho seria menor, mas mesmo<br />
assim nÃ£o Ã© uma soluÃ§Ã£o muito elegante.</p>
<p>Outra soluÃ§Ã£o seria gerar o CSS a partir de um script, por exemplo, PHP. Mas isso estÃ¡ fora de questÃ£o jÃ¡ que evitaria o caching<br />
pra sempre, a nÃ£o ser que vocÃª controlasse o caching pelo PHP &#8211; o que nÃ£o Ã© a mais trivial das tarefas.</p>
<p>Diante do problema, ponderei sobre algumas possÃ­veis soluÃ§Ãµes e a melhor que achei foi fazer uso do<br />
<a href="http://httpd.apache.org/docs-2.0/mod/mod_rewrite.html">mod_rewrite</a> do <a href="http://httpd.apache.org/">apache</a>.</p>
<p>O processo Ã© bem simples. Digamos que vocÃª tenha um arquivo chamado <em>estilo.css</em>. Ao atualizÃ¡-lo, salve-o como<br />
<em>estilo2.css</em> e use a seguinte regra de reescrita no seu arquivo <a href="http://httpd.apache.org/docs-2.0/howto/htaccess.html">.htaccess</a></p>
<pre>RewriteEngine On
RewriteRule ^estilo.css$ /estilo2.css</pre>
<p>Simples e indolor. Agora Ã© sÃ³ subir os dois arquivos (.htaccess e estilo2.css) para o servidor e pronto, o CSS vai ser atualizado<br />
automaticamente. Feito isso vocÃª pode apagar o arquivo <em>estilo.css</em> original.</p>
<p><strong>[update]</strong>A <a href="http://blog.elcio.com.br/css-e-cache/">tÃ©cnica</a> do <a href="http://blog.elcio.com.br/">Ã‰lcio</a> Ã© bem mais simples, elegante e eficiente. Hoje em dia, Ã© a que uso.<strong>[/update]</strong></p>
<div id="crp_related"><h3>Leia tambÃ©m:</h3><ul><li><a href="http://brunotorres.net/evitando-caching-css-somente-quando-atualizado" rel="bookmark" class="crp_title">Evitando caching quando (e sÃ³ quando) o arquivo CSS for atualizado</a></li><li><a href="http://brunotorres.net/urls-again" rel="bookmark" class="crp_title">URLs amigÃ¡veis &#8211; esclarecendo dÃºvidas</a></li><li><a href="http://brunotorres.net/urls" rel="bookmark" class="crp_title">Gerenciamento de URLs &#8211; Criando URLs amigÃ¡veis</a></li><li><a href="http://brunotorres.net/redirecionar-feed-feedburner" rel="bookmark" class="crp_title">Redirecionando seu feed para o Feedburner</a></li><li><a href="http://brunotorres.net/urls-php" rel="bookmark" class="crp_title">Gerenciamento de URLs com PHP</a></li><li><a href="http://brunotorres.net/feedburner-estatisticas-economia-de-banda-e-um-trato-no-visual-dos-seus-feeds" rel="bookmark" class="crp_title">Feedburner: estatÃ­sticas, economia de banda e um trato no visual dos seus feeds</a></li><li><a href="http://brunotorres.net/bfutnet-no-ar" rel="bookmark" class="crp_title">BFUT.net no ar</a></li><li><a href="http://brunotorres.net/caching-feeds" rel="bookmark" class="crp_title">Implementando caching em feeds RSS/ATOM</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://brunotorres.net/evitando-caching-css/feed</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>Gerenciamento de URLs com PHP</title>
		<link>http://brunotorres.net/urls-php</link>
		<comments>http://brunotorres.net/urls-php#comments</comments>
		<pubDate>Sat, 19 Mar 2005 06:39:00 +0000</pubDate>
		<dc:creator>Bruno Torres</dc:creator>
				<category><![CDATA[apache]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[mod_rewrite]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[urls]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Estou devendo aos meus leitores um artigo sobre como criar e gerenciar um bom esquema de URLs usando PHP e freqÃ¼entemente sou cobrado por isso. Neste texto vou tentar explicar o funcionamento e as vantagens do gerenciamento de URLs com PHP em relaÃ§Ã£o ao gerenciamento de URLs usando apenas mod_rewrite. Este artigo nÃ£o Ã© uma [...]]]></description>
			<content:encoded><![CDATA[<p>Estou devendo aos meus leitores um artigo sobre como criar e gerenciar um bom esquema de URLs usando PHP e freqÃ¼entemente sou cobrado por isso.<!--<a id="gotocontentlink" href="#post-content">Pular anúncios</a>--><div class="adpostsearch">
<div>
<script type="text/javascript"><!--
google_ad_client = "pub-6502782542223555";
/* adPostSearch */
google_ad_slot = "4051981144";
google_ad_width = 336;
google_ad_height = 280;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
</div></div><!--<a name="post-content"></a>-->

<p>Neste texto vou tentar explicar o funcionamento e as vantagens do gerenciamento de URLs com PHP em relaÃ§Ã£o ao <a href="/web/urls">gerenciamento de URLs usando apenas mod_rewrite.</a></p>
<p>Este artigo nÃ£o Ã© uma traduÃ§Ã£o, mas Ã© fortemente baseado no artigo de Till Quack para o A List Apart, <a href="http://www.alistapart.com/articles/succeed/">How to succeed with URLs</a>.</p>
<p>A principal vantagem de se usar PHP ao invÃ©s de apenas o <a href="http://httpd.apache.org/docs-2.0/mod/mod_rewrite.html">mod_rewrite</a> Ã© que o PHP Ã© bem mais simples. O mod_rewrite Ã© conhecido tanto pelo seu poder quanto pela sua complexidade, nÃ£o apenas pelo fato de ser necessÃ¡rio um bom entendimento de <a href="http://guia-er.sourceforge.net/guia-er.html">expressÃµes regulares</a> para poder usÃ¡-lo mas tambÃ©m por ser um tanto obscuro e difÃ­cil de entender, principalmente para os iniciantes.</p>
<p>Ã‰ importante que vocÃª entenda o que eu quero dizer com o termo <em>gerenciamento de URLs</em> antes de ler o restante deste texto. Dois textos escritos por mim podem ajudÃ¡-lo a entender melhor o que isso significa: <a href="/web/urls">Gerenciamento de URLs &#8211; Criando URLs amigÃ¡veis</a> e <a href="/web/urls-again">URLs amigÃ¡veis &#8211; esclarecendo dÃºvidas</a>.</p>
<p>O principal conceito a ser entendido sobre as URLs Ã© que elas nem sempre se referem a um arquivo ou diretÃ³rio existente no disco. Na realidade, URLs nunca devem se referir a arquivos diretamente. Isso torna suas URLs volÃ¡teis, vulnerÃ¡veis a mudanÃ§as. Afinal, como diria Tim Berners-Lee, <a href="http://www.w3.org/Provider/Style/URI.html">cool URIs don&#8217;t change</a>.</p>
<p>Para usar as tÃ©cnicas descritas neste texto vocÃª precisa do servidor web <a href="http://httpd.apache.org/">Apache</a> com o mod_rewrite habilitado, <a href="http://www.php.net/">PHP</a> e, principalmente, um bom planejamento. Antes de qualquer coisa, planeje como vocÃª quer que suas URLs sejam. Use URLs que resumam de maneira adequada e sucinta o conteÃºdo do recurso que descrevem.</p>
<p>Bem, agora que vocÃª jÃ¡ tem seu esquema de URLs bem planejado, vamos ao que interessa. MÃ£os Ã  obra.</p>
<p>Crie um script PHP. Vamos chamÃ¡-lo de urls.php. Todo trÃ¡fego do site (com algumas exceÃ§Ãµes) serÃ¡ direcionado para esse script. Para fazer isso, crie um arquivo <a href="http://httpd.apache.org/docs-2.0/howto/htaccess.html">.htaccess</a> na raiz do seu site com o seguinte conteÃºdo:</p>
<pre>RewriteEngine On
RewriteRule !\.(gif|jpg|png|css)$ /raiz_do_site/urls.php</pre>
<p>A primeira linha serve para ligar o mod_rewrite e a segunda Ã© a que direciona o trÃ¡fego para urls.php. O conteÃºdo entre parÃªntesis define as extensÃµes de arquivo que devem ser excluÃ­das desse processo, ou seja, devem ser tratadas da maneira padrÃ£o pelo servidor web. VocÃª pode querer incluir mais algumas extensÃµes nessa lista (swf, svg, xml, js, txt, por exemplo), de acordo com a sua necessidade.</p>
<p>VocÃª deve substituir <em>raiz_do_site</em> pelo caminho completo do seu site no servidor, por exemplo, /home/httpd/dominio.com/. PorÃ©m, em algumas configuraÃ§Ãµes do apache (todas que eu particularmente jÃ¡ usei), apenas o caminho relativo jÃ¡ Ã© o suficiente, no caso /urls.php ou apenas urls.php.</p>
<p>Agora vamos comeÃ§ar a escrever o script urls.php.</p>
<p>O primeiro passo Ã© verificar se a requisiÃ§Ã£o refere-se a um arquivo existente.</p>
<pre>&lt;?php
//CÃ³digo retirado do A List Apart
$DOCUMENT_ROOT = $_SERVER['DOCUMENT_ROOT'];
$REQUEST_URI = $_SERVER['REQUEST_URI'];
$SCRIPT_FILENAME = $_SERVER['SCRIPT_FILENAME'];
if(file_exists($DOCUMENT_ROOT.$REQUEST_URI)
and ($SCRIPT_FILENAME!=$DOCUMENT_ROOT.$REQUEST_URI)
and ($REQUEST_URI!="/")){
    $url=$REQUEST_URI;
    include($DOCUMENT_ROOT.$url);
    exit();
}</pre>
<p>Simplesmente verificamos se a URL refere-se a um arquivo existente, incluimos este arquivo e encerramos o script.</p>
<p>O prÃ³ximo passo Ã© dividir a URL em pedaÃ§os separados por &#8220;/&#8221; e verificar se o user-agent fez uma requisiÃ§Ã£o pela index do site.</p>
<pre>$url=strip_tags($REQUEST_URI);
$url_array=explode("/",$url);
array_shift($url_array); //o primeiro Ã­ndice sempre serÃ¡ vazio
if(empty($url_array)){
	include("site_index.php");
exit();
}</pre>
<p>Trivial, nÃ£o? Se $REQUEST_URI estiver vazia significa que o usuÃ¡rio estÃ¡ requisitando a index do site. Neste caso, incluimos o script referente Ã  index e encerramos o script.</p>
<p>Bom, se o usuÃ¡rio nÃ£o requisitou um arquivo existente nem a index do site, chegou a hora de verificar se o que ele estÃ¡ tentando acessar Ã© um conteÃºdo dinÃ¢mico. Provavelmente algo armazenado em um banco de dados, arquivos XML ou o que quer que vocÃª use pra armazenar o conteÃºdo dinÃ¢mico do seu site.</p>
<p>Neste caso nÃ£o hÃ¡ uma fÃ³rmula pronta. Cada caso Ã© um caso. Como vocÃª jÃ¡ planejou previamente o seu esquema de URLs, com certeza vocÃª sabe o que cada URL descreve. Portanto, vocÃª deve cuidar dessa parte.</p>
<p>Vou usar uma funÃ§Ã£o fictÃ­cia <strong>verifica_conteudo()</strong> que retorna true caso a URL requisitada corresponda a algum dado presente, por exemplo, no seu banco de dados e uma outra <strong>exibe_conteudo()</strong> que cuidarÃ¡ para que este conteÃºdo seja exibido da forma adequada.</p>
<pre>if (verifica_conteudo()){
	exibe_conteudo();
	exit();
}</pre>
<p>Se tambÃ©m nÃ£o houver conteÃºdo dinÃ¢mico referente Ã  URL requisitada, sÃ³ nos resta enviar um erro 404, informando ao user agent que o recurso requisitado nÃ£o existe.</p>
<pre>header("HTTP/1.1 404 Not Found");
exit();
</pre>
<p>Alguns cuidados devem ser tomados em relaÃ§Ã£o a usuÃ¡rios maliciosos que queiram tentar acessar arquivos do seu sistema que podem causar danos ou garantir acesso privilegiado. Para prevenir esse tipo de coisa, adicione no inÃ­cio do script algumas linhas de cÃ³digo verificando se o usuÃ¡rio estÃ¡ requisitando algo como &#8220;../../../algum_script&#8221; ou coisas do tipo.</p>
<p>Acessos a URLs longas demais tambÃ©m devem ser prevenidos. Para isso, inclua o seguinte no inÃ­cio do script:</p>
<pre>if(strlen($REQUEST_URI)>100){
	header("HTTP/1.1 404 Not Found");
	exit();
}</pre>
<p>E Ã© isso. O desenvolvimento desse script vai depender exclusivamente do seu caso especÃ­fico. A idÃ©ia Ã© essa. Se vocÃª a entendeu vai ser fÃ¡cil adaptÃ¡-la para a sua necessidade.</p>
<p>Mas, alÃ©m disso, hÃ¡ outra coisa interessante que se pode fazer com esse script que &#8211; para mim pelo menos &#8211; nÃ£o Ã© possÃ­vel fazer usando apenas regras do mod_rewrite.</p>
<p>Lembra quando vocÃª ainda nÃ£o conhecia as vantagens de se usar URLs amigÃ¡veis e usava URLs do tipo <em>index.php?var1=valor1&amp;var2=valor2&#8230;</em>? EntÃ£o, agora vocÃª estÃ¡ usando URLs totalmente diferentes e nÃ£o Ã© legal deixar &#8220;quebrados&#8221; todos os links e bookmarks que apontam para as URLs antigas, concorda?</p>
<p>Desde que haja alguma correspondÃªncia (Ã© bem provÃ¡vel que haja) entre as URLs antigas e as novas, Ã© possÃ­vel mantÃª-las funcionando, lanÃ§ando mÃ£o de redirecionamentos permanentes (cÃ³digo HTTP 301).</p>
<p>Como? Bem, a o cÃ³digo vai variar de acordo com o esquema de URLs usado. VocÃª pode criar um cÃ³digo que analise a URL e redirecione para a URL nova. Exemplo: digamos que suas URLs antigas fossem da forma <em>index.php?s=secao&amp;a=artigo</em> e as novas sejam da forma <em>/secao/artigo</em>. Neste caso, ao dividir a URL em pedaÃ§os terÃ­amos $url_array[0] = &#8220;index.php?s=secao&amp;a=artigo&#8221;. O que precisamos fazer Ã© dividÃ­-la novamente em pedaÃ§os, pegar os valores das variÃ¡veis que nos interessam, manipulÃ¡-las se for necessÃ¡rio e redirecionar para a URL correta.</p>
<pre>$url = explode("?", $url_array[0]);
array_shift($url);
$url = explode("&amp;", $url[0]);
$secao = explode("=", $url[0]);
$secao = $secao[1];
$artigo = explode("=", $url[1]);
$artigo = $artigo[1];
$url = "http://dominio.com/$secao/$artigo";
header("HTTP/1.1 301 Moved Permanently");
header("Location: " . $url);</pre>
<p>Acho que nÃ£o preciso explicar esse pedaÃ§o de cÃ³digo, nÃ£o Ã©? Bom, de qualquer maneira, vocÃª precisa adaptÃ¡-lo para o seu caso.</p>
<p>Por Ãºltimo temos que cuidar dos diretÃ³rios que eventualmente precisem ser manipulados diretamente pelo servidor web, sem a interferÃªncia do mod_rewrite e do nosso script. Por exemplo, vocÃª pode ter um diretÃ³rio &#8220;/unsorted/&#8221; onde vocÃª guarda arquivos aleatÃ³rios e deseja que o conteÃºdo desse diretÃ³rio seja listado da maneira padrÃ£o pelo apache. Ou entÃ£o, diretÃ³rios com arquivos index.html que devem se comportar da maneira padrÃ£o. Ou ainda diretÃ³rios protegidos por senha.</p>
<p>Neste caso, serÃ¡ necessÃ¡rio adicionar uma regra de reescrita em nosso .htaccess para cada diretÃ³rio desses. Em princÃ­pio eu imaginei que fosse possÃ­vel colocar todos em uma regra sÃ³, utilizando o alternador &#8220;|&#8221; mas, por algum motivo que desconheÃ§o, nÃ£o funciona. A regra Ã© a seguinte:</p>
<pre>RewriteRule   ^unsorted/.*$ - [L]</pre>
<p>O &#8220;-&#8221; informa ao mod_rewrite para sair do caminho e deixar o apache cuidar sozinho da requisiÃ§Ã£o e o &#8220;[L]&#8221; faz com que essa regra, se satisfeita, seja a Ãºltima a ser executada. Nenhuma RewriteRule posterior serÃ¡ avaliada. No caso, seu .htaccess deve ficar mais ou menos assim:</p>
<pre>RewriteEngine On
RewriteRule   ^unsorted/.*$ - [L]
RewriteRule !\.(gif|jpg|png|css)$ /raiz_do_site/urls.php</pre>
<p>Concluindo, mais uma vez deixo claro que nÃ£o hÃ¡ fÃ³rmula mÃ¡gica para gerenciar suas URLs. Mas o processo nÃ£o Ã© complicado e, uma vez entendido, Ã© simples aplicÃ¡-lo a qualquer caso. Desde que vocÃª planeje seu esquema de URLs da maneira adequada.</p>
<div id="crp_related"><h3>Leia tambÃ©m:</h3><ul><li><a href="http://brunotorres.net/urls-again" rel="bookmark" class="crp_title">URLs amigÃ¡veis &#8211; esclarecendo dÃºvidas</a></li><li><a href="http://brunotorres.net/urls" rel="bookmark" class="crp_title">Gerenciamento de URLs &#8211; Criando URLs amigÃ¡veis</a></li><li><a href="http://brunotorres.net/redirecionar-feed-feedburner" rel="bookmark" class="crp_title">Redirecionando seu feed para o Feedburner</a></li><li><a href="http://brunotorres.net/preco-erro" rel="bookmark" class="crp_title">O preÃ§o de um erro</a></li><li><a href="http://brunotorres.net/feedburner-estatisticas-economia-de-banda-e-um-trato-no-visual-dos-seus-feeds" rel="bookmark" class="crp_title">Feedburner: estatÃ­sticas, economia de banda e um trato no visual dos seus feeds</a></li><li><a href="http://brunotorres.net/evitando-caching-css" rel="bookmark" class="crp_title">Evitando caching ao atualizar arquivos CSS</a></li><li><a href="http://brunotorres.net/seguindo-padroes" rel="bookmark" class="crp_title">Seguindo Ã  risca os padrÃµes</a></li><li><a href="http://brunotorres.net/rss-kernel" rel="bookmark" class="crp_title">RSS com as versÃµes mais atuais do kernel do linux</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://brunotorres.net/urls-php/feed</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
		<item>
		<title>URLs amigÃ¡veis &#8211; esclarecendo dÃºvidas</title>
		<link>http://brunotorres.net/urls-again</link>
		<comments>http://brunotorres.net/urls-again#comments</comments>
		<pubDate>Tue, 01 Feb 2005 22:00:00 +0000</pubDate>
		<dc:creator>Bruno Torres</dc:creator>
				<category><![CDATA[apache]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[mod_rewrite]]></category>
		<category><![CDATA[urls]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Tenho recebido diversos emails de pessoas que leram meu artigo sobre URLs amigÃ¡veis e nÃ£o entenderam muito bem o processo. Vou tentar explicar um pouco melhor esse processo. A primeira coisa que precisa ficar clara Ã© que o google &#8212; assim como qualquer outra search engine &#8212; nÃ£o tem acesso aos arquivos dinÃ¢micos do seu [...]]]></description>
			<content:encoded><![CDATA[<p>Tenho recebido diversos emails de pessoas que leram meu artigo sobre <a href="/web/urls">URLs amigÃ¡veis</a> e nÃ£o entenderam muito bem o processo.<!--<a id="gotocontentlink" href="#post-content">Pular anúncios</a>--><div class="adpostsearch">
<div>
<script type="text/javascript"><!--
google_ad_client = "pub-6502782542223555";
/* adPostSearch */
google_ad_slot = "4051981144";
google_ad_width = 336;
google_ad_height = 280;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
</div></div><!--<a name="post-content"></a>-->

<p>Vou tentar explicar um pouco melhor esse processo.</p>
<p>A primeira coisa que precisa ficar clara Ã© que o google &#8212; assim como qualquer outra search engine &#8212; nÃ£o tem acesso aos arquivos dinÃ¢micos do seu site. Os spiders acessam apenas o cÃ³digo (X)HTML gerado por eles.</p>
<p>Ã‰ importante entender que <strong>um spider Ã© como um usuÃ¡rio qualquer</strong>. A diferenÃ§a Ã© que ele Ã© uma ferramenta automatizada que percorre os links que encontra e cria um Ã­ndice que serÃ¡ usado pelo sistema de busca.</p>
<p>Outra coisa que tambÃ©m precisa ser entendida Ã© que os spiders associam um recurso (uma pÃ¡gina HTML, por exemplo) com a URL usada para chegar atÃ© ele. Exemplificando: digamos que vocÃª decida usar o mod_rewrite para criar URLs amigÃ¡veis.</p>
<p>Sendo assim, uma pÃ¡gina que antes seria acessada pela URL <em>www.seusite.com/index.php?data=01-02-2005&amp;nome =meu-artigo</em><sup><a href="#note1">1</a></sup> agora serÃ¡ acessada por <em>www.seusite.com/01/02/2005/meu-artigo</em>. A URL antiga continuarÃ¡ funcionando e o google sÃ³ passarÃ¡ a listar a nova URL se todos os links para a referida pÃ¡gina forem atualizados para a nova URL.</p>
<p>A troca &#8212; ou reescrita &#8212; das URLs Ã© feita pelo apache de maneira transparente ao usuÃ¡rio, portanto, apenas o servidor<br />
tem conhecimento desta reescrita. O usuÃ¡rio, assim como o spider, nÃ£o consegue perceber este processo.</p>
<p><strong>Reescrita de URL Ã© diferente de redirecionamento</strong>. Um redirecionamento informa ao user agent (browser, spider, leitor de tela, etc) que um recurso encontra-se acessÃ­vel por outra URL. O user agent aponta para a nova URL e acessa o recurso. O processo de redirecionamento nÃ£o Ã© transparente ao usuÃ¡rio.</p>
<p>JÃ¡ a reescrita (feita pelo mod_rewrite) Ã© um processo interno ao servidor web. Este analisa uma regra de reescrita (RewriteRule)<br />
existente em um arquivo .htaccess, executa um redirecionamento e entrega o recurso ao user agent sem informar uma nova URL.<br />
Vou tentar explicar com um exemplo:</p>
<p>Consideremos a URL citada acima: <em>www.seusite.com/index.php?data=01-02-2005&amp;nome=meu-artigo</em><sup><a href="#note1">1</a></sup>. Esta URL chama um script PHP, com duas variÃ¡veis e seus respectivos valores. O script executa alguma aÃ§Ã£o com esses valores (lÃª os dados de um banco de dados, por exemplo) e entrega ao user agent um documento HTML.</p>
<p>Para reescrever essa URL para <em>www.seusite.com/01/02/2005/meu-artigo</em> podemos usar a seguinte regra de reescrita:</p>
<pre>RewriteEngine On #Liga o mecanismo de reescrita (mod_rewrite)
RewriteRule ^([0-9]+)\/([0-9]+)\/([0-9]+)\/([A-Za-z-]+)$ /index.php?data=$1-$2-$3&amp;nome=$4</pre>
<p>Explicar a regra acima estÃ¡ fora do escopo deste artigo. Leia o artigo <a href="/web/urls">Gerenciamento de URLs &#8211; Criando URLs amigÃ¡veis</a>.</p>
<p>O que quero deixar claro Ã© como o apache vai executar esta tarefa.</p>
<p>O arquivo .htaccess Ã© processado pelo apache toda vez que ele acessa um arquivo dentro do diretÃ³rio onde ele (o .htaccess) se encontra. Quando um usuÃ¡rio tentar acessar a URL <em>www.seusite.com/01/02/2005/meu-artigo</em> o apache vai casar o padrÃ£o desta URL com a expressÃ£o regular presente na RewriteRule. Havendo compatibilidade &#8212; e neste caso hÃ¡ &#8212; ele vai verificar a segunda parte da regra (/index.php?data=$1-$2-$3&amp;nome=$4) e fazer uma requisiÃ§Ã£o ao arquivo com as substituiÃ§Ãµes necessÃ¡rias (no caso /index.php?data=01-02-2005&amp;nome=meu-artigo). O script vai realizar as operaÃ§Ãµes necessÃ¡rias para gerar o conteÃºdo HTML e o apache entregarÃ¡ este conteÃºdo direto ao user agent. Processo transparente, lembra-se?</p>
<p>Mais uma vez, para essa troca de URL fazer alguma diferenÃ§a nos sites de busca Ã© necessÃ¡rio que se troquem todas as referÃªncias. Ou seja, trocar &lt;a href=&#8221;http://www.seusite.com/index.php?data=01-02-2005&amp;nome=meu-artigo&#8221;&gt;Meu artigo&lt;/a&gt;<sup><a href="#note1">1</a></sup> por &lt;a href=&#8221;http://www.seusite.com/01/02/2005/meu-artigo&#8221;&gt;Meu artigo&lt;/a&gt;.</p>
<p>Outra coisa importante sÃ£o os links vindos de outros sites. Se vocÃª puder, peÃ§a aos administradores dos sites para trocarem os links.</p>
<p>Espero com este texto ter esclarecido as dÃºvidas que restaram sobre mod_rewrite e URLs amigÃ¡veis. Se houver algum ponto que nÃ£o tenha sido esclarecido, por favor, comentem.</p>
<p id="note1">[1] O espaÃ§o antes do &#8216;=&#8217; foi incluÃ­do para proporcionar quebra de linha quando necessÃ¡rio e nÃ£o faz parte da URL.</p>
<div id="crp_related"><h3>Leia tambÃ©m:</h3><ul><li><a href="http://brunotorres.net/urls" rel="bookmark" class="crp_title">Gerenciamento de URLs &#8211; Criando URLs amigÃ¡veis</a></li><li><a href="http://brunotorres.net/urls-php" rel="bookmark" class="crp_title">Gerenciamento de URLs com PHP</a></li><li><a href="http://brunotorres.net/redirecionar-feed-feedburner" rel="bookmark" class="crp_title">Redirecionando seu feed para o Feedburner</a></li><li><a href="http://brunotorres.net/evitando-caching-css" rel="bookmark" class="crp_title">Evitando caching ao atualizar arquivos CSS</a></li><li><a href="http://brunotorres.net/feedburner-estatisticas-economia-de-banda-e-um-trato-no-visual-dos-seus-feeds" rel="bookmark" class="crp_title">Feedburner: estatÃ­sticas, economia de banda e um trato no visual dos seus feeds</a></li><li><a href="http://brunotorres.net/seguindo-padroes" rel="bookmark" class="crp_title">Seguindo Ã  risca os padrÃµes</a></li><li><a href="http://brunotorres.net/caching-feeds" rel="bookmark" class="crp_title">Implementando caching em feeds RSS/ATOM</a></li><li><a href="http://brunotorres.net/preco-erro" rel="bookmark" class="crp_title">O preÃ§o de um erro</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://brunotorres.net/urls-again/feed</wfw:commentRss>
		<slash:comments>62</slash:comments>
		</item>
		<item>
		<title>Gerenciamento de URLs &#8211; Criando URLs amigÃ¡veis</title>
		<link>http://brunotorres.net/urls</link>
		<comments>http://brunotorres.net/urls#comments</comments>
		<pubDate>Mon, 09 Aug 2004 18:30:00 +0000</pubDate>
		<dc:creator>Bruno Torres</dc:creator>
				<category><![CDATA[apache]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[mod_rewrite]]></category>
		<category><![CDATA[urls]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Hoje em dia Ã© muito comum o uso de scripts que rodam no servidor (server-side) para gerar conteÃºdo dinÃ¢mico em pÃ¡ginas web. Isto Ã© muito interessante, mas gera um problema: URLs grandes ou complicadas demais, difÃ­ceis de memorizar e sem significado, que podem atÃ© mesmo dificultar a indexaÃ§Ã£o do site por mecanismos de busca. Vamos [...]]]></description>
			<content:encoded><![CDATA[<p>Hoje em dia Ã© muito comum o uso de scripts que rodam no servidor (server-side) para gerar conteÃºdo dinÃ¢mico em pÃ¡ginas web.<!--<a id="gotocontentlink" href="#post-content">Pular anúncios</a>--><div class="adpostsearch">
<div>
<script type="text/javascript"><!--
google_ad_client = "pub-6502782542223555";
/* adPostSearch */
google_ad_slot = "4051981144";
google_ad_width = 336;
google_ad_height = 280;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
</div></div><!--<a name="post-content"></a>-->

<p>Isto Ã© muito interessante, mas gera um problema: URLs grandes ou complicadas demais, difÃ­ceis de memorizar e sem significado, que podem atÃ© mesmo dificultar a indexaÃ§Ã£o do site por mecanismos de busca.</p>
<p>Vamos aprender como criar URLs amigÃ¡veis,  indexÃ¡veis e que resumam, de alguma forma, o recurso que elas descrevem.</p>
<h3 id="intro">IntroduÃ§Ã£o</h3>
<p>Ã‰ comum vermos URLs do tipo:<br />
index.php?section=artigos&amp;data=09-08-2004<br />
ou <br />
index.php?s=web&amp;p=1<br />
ou piores que isso, como:<br />
/cgi-bin/index.cgi?id=7288731803928617293&amp;page=6</p>
<p>Os exemplos acima sÃ£o fictÃ­cios mas, com certeza vocÃª jÃ¡ se deparou com URLs bem parecidas com essas, inclusive em sites muito conhecidos.</p>
<h3>Qual o problema dessas URLs?</h3>
<p>A princÃ­pio vocÃª pode pensar que nÃ£o hÃ¡ problema algum com essas URLs. Mas pense um segundo. VocÃª consegue decorar uma URL desse tipo? NÃ£o seria muito melhor que fosse algo do tipo:<br />
www.site.com/artigos/09/08/2004<br />
ou<br />
www.site.com/web/1</p>
<p>AlÃ©m do problema da complexidade, essas URLs geram outros problemas:</p>
<ul>
<li>Alguns mecanismos de busca podem deixar de indexar estas pÃ¡ginas, por causa dos caracteres &#8216;?&#8217; e &#8216;&amp;&#8217;</li>
<li>A tecnologia usada na construÃ§Ã£o do site estÃ¡ sendo exposta</li>
<li>Se vocÃª resolver mudar a tecnologia do seu site (php para asp, por exemplo), todas as URLs terÃ£o que ser mudadas</li>
</ul>
<p>Expor a tecnologia usada para fazer um site pode ser um problema de seguranÃ§a e, hoje em dia, qualquer cuidado com seguranÃ§a, mesmo que pequeno, Ã© importante.</p>
<p>E, alÃ©m disso, com a mudanÃ§a da tecnologia usada, todos os links e bookmarks que existam para o seu site serÃ£o quebrados, e isso nÃ£o Ã© nem um pouco interessante.</p>
<h3>O que fazer entÃ£o?</h3>
<p>A soluÃ§Ã£o que vou apresentar serve para os usuÃ¡rios do servidor web <a href="http://httpd.apache.org">apache</a>.</p>
<p>Ã‰ necessÃ¡rio que esteja habilitado no servidor o mÃ³dulo <a href="http://httpd.apache.org/docs-2.0/mod/mod_rewrite.html">mod_rewrite</a> e que seja possÃ­vel o uso de arquivos <a href="http://httpd.apache.org/docs-2.0/howto/htaccess.html">htaccess</a>.</p>
<p>A soluÃ§Ã£o Ã© simples: mapear as URLs reais para URLs &#8220;virtuais&#8221;, mais fÃ¡ceis de compreender e indexar, e independentes da tecnologia utilizada.</p>
<p>Ã‰ necessÃ¡rio um pouco de conhecimento de <a href="http://guia-er.sourceforge.net/guia-er.html">expressÃµes regulares</a>.</p>
<h3>O que Ã© o mod_rewrite</h3>
<p>mod_rewrite Ã© um mÃ³dulo do apache que realiza a reescrita transparente de URLs usando expressÃµes regulares.</p>
<p>Ã‰ como se fosse um redirecionamento, sÃ³ que o usuÃ¡rio nÃ£o fica sabendo que a pÃ¡gina foi reescrita, jÃ¡ que o endereÃ§o na barra de endereÃ§os do browser nÃ£o muda e nenhum cabeÃ§alho HTTP <a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.3.1">3xx</a> Ã© enviado.</p>
<h3>MÃ£os a obra</h3>
<p>O primeiro passo Ã© criar um arquivo <a href="http://httpd.apache.org/docs-2.0/howto/htaccess.html">htaccess</a> no diretÃ³rio raiz do seu site (<a href="http://httpd.apache.org/docs-2.0/mod/core.html#documentroot">DocumentRoot</a> e acrescentar a linha:<br />
<code>RewriteEngine On</code><br />
Esta linha habilita o uso do <a href="http://httpd.apache.org/docs-2.0/mod/mod_rewrite.html">mod_rewrite</a> no seu site.</p>
<p>Agora vamos ?  reescrita da URL. Vamos utilizar os exemplos <a href="#intro">acima</a>. SÃ£o exemplos simples, mas meu intuito Ã© mostrar o funcionamento da tÃ©cnica. VocÃª pode usar a sua criatividade para fazer o que quiser e o que for necessÃ¡rio para o seu caso.</p>
<p>Primeiro exemplo: <strong>index.php?s=web&amp;p=1</strong></p>
<p>Analisando esta URL podemos perceber que temos duas variÃ¡veis (&#8216;s&#8217; e &#8216;p&#8217;), provavelmente referentes a seÃ§Ã£o e pÃ¡gina, respectivamente.</p>
<p>Vamos transformÃ¡-la em: /web/1</p>
<p>A regra ficaria assim:<br />
<code>RewriteRule ^(.+)\/?([0-9]*)\/?$ /index.php?s=$1&amp;p=$2</code></p>
<p>Vamos entender a linha acima:<br />
<strong>RewriteRule</strong>: define o inÃ­cio de uma regra de reescrita.</p>
<p><strong>^(.+)\/?([0-9]*)\/?$</strong>: a url &#8220;virtual&#8221;, ou seja, a url que serÃ¡ usada nos links para esta pÃ¡gina. Para que entende um pouco de <a href="http://guia-er.sourceforge.net/guia-er.html">expressÃµes regulares</a>, esta expressÃ£o Ã© bem simples de entender, vamos dissecÃ¡-la:<br />
<strong>(.+)</strong>: significa <em>um</em> ou mais caracteres (.). O significado dos parÃªntesis vai ser explicado mais adiante.<br />
<strong>\/?</strong>: <em>zero</em> ou <em>uma</em> barra (/). A contrabarra (\) serve para &#8220;escapar&#8221; o caractere /, informando que ele deve ser interpretado literalmente, e nÃ£o como um <a href="http://guia-er.sourceforge.net/guia-er-8.html">metacaractere</a>.</p>
<p><strong>([0-9])*</strong>: <em>qualquer</em> quantidade de dÃ­gitos (nÃºmeros), ou seja, <em>zero</em> ou mais.<br />
<strong>/index.php?s=$1&amp;p=$2</strong>: esta Ã© a URL real, ou seja, a url que vai estar sendo acessada por meio do mod_rewrite.<br />
As expressÃµes &#8216;$1&#8242; e &#8216;$2&#8242; significam o primeiro e segundo conjunto de caracteres agrupados por parÃªnteses na expressÃ£o da esquerda. Ou seja, Ã© guardada uma referÃªncia para esses grupos de caracteres para que vocÃª possa usÃ¡-los.</p>
<p>Exemplos do resultado desta regra:</p>
<p>/web/1 ou /web/1/ = /index.php?s=web&amp;p=1<br />
/outrasecao/5 ou /outrasecao/5/ = /index.php?s=outrasecao&amp;p=5<br />
/web ou /web/ = index.php?s=web&amp;p=</p>
<p>Vamos a mais um exemplo:<br />
<code>RewriteRule ^artigos\/?([0-9]+)\/([0-9]+)\/([0-9]+)\/?$ index.php?section=artigos&amp;data=$1-$2-$3</code><br />
(Perceba que a linha pode estar quebrada para caber no espaÃ§o, mas trata-se de uma linha sÃ³, sem quebras).</p>
<p>Assim, vocÃª poderia acessar a URL index.php?section=artigos&amp;data=09-08-2004 pela URL &#8220;virtual&#8221; artigos/09/08/2004, bem mais amigÃ¡vel do que a primeira.</p>
<p>NÃ£o apenas pÃ¡ginas dinÃ¢micas podem ser reescritas por meio do mod_rewrite. ConteÃºdo estÃ¡tico tambÃ©m.</p>
<p>Um exemplo:<br />
www.site.com/noticias/09-08-2004.html<br />
poderia ser reescrita para<br />
www.site.com/noticias/09/08/2004</p>
<p>usando a regra<br />
<code>RewriteRule ^noticias\/?([0-9]+)\/([0-9]+)\/([0-9]+)\/?$ /noticias/$1-$2-$3</code></p>
<h3>ConclusÃ£o</h3>
<p>O intuito deste artigo foi apresentar o mod_rewrite e mostrar como criar URLs mais amigÃ¡veis, tanto para o usuÃ¡rio quanto para os mecanismos de busca. VocÃª pode fazer praticamente qualquer mapeamento de URLs utilizando o mod_rewrite, o que vocÃª precisa Ã© identificar um padrÃ£o nas URLs do seu site e criar as regras de reescrita. O limite Ã© o da sua criatividade.</p>
<p>Alguns links para artigos semelhantes e recursos interessantes que podem ajudar bastante:</p>
<ul>
<li><a href="http://www.alistapart.com/articles/urls/">Artigo de Bill Humphries para o site A list apart</a> que serviu de base para este</li>
<li><a href="http://httpd.apache.org/docs-2.0/mod/mod_rewrite.html">DocumentaÃ§Ã£o do mod_rewrite</a></li>
<li><a href="http://guia-er.sourceforge.net/guia-er.html">Guia de expressÃµes regulares</a></li>
<li><a href="http://www.w3.org/Provider/Style/URI">Cool URIs don&#8217;t change</a> por Tim Berners-Lee</li>
<li><a href="http://www.useit.com/alertbox/990321.html">URL as UI</a> por Jakob Nielsen</li>
</ul>
<div id="crp_related"><h3>Leia tambÃ©m:</h3><ul><li><a href="http://brunotorres.net/urls-again" rel="bookmark" class="crp_title">URLs amigÃ¡veis &#8211; esclarecendo dÃºvidas</a></li><li><a href="http://brunotorres.net/urls-php" rel="bookmark" class="crp_title">Gerenciamento de URLs com PHP</a></li><li><a href="http://brunotorres.net/evitando-caching-css" rel="bookmark" class="crp_title">Evitando caching ao atualizar arquivos CSS</a></li><li><a href="http://brunotorres.net/redirecionar-feed-feedburner" rel="bookmark" class="crp_title">Redirecionando seu feed para o Feedburner</a></li><li><a href="http://brunotorres.net/feedburner-estatisticas-economia-de-banda-e-um-trato-no-visual-dos-seus-feeds" rel="bookmark" class="crp_title">Feedburner: estatÃ­sticas, economia de banda e um trato no visual dos seus feeds</a></li><li><a href="http://brunotorres.net/preco-erro" rel="bookmark" class="crp_title">O preÃ§o de um erro</a></li><li><a href="http://brunotorres.net/seguindo-padroes" rel="bookmark" class="crp_title">Seguindo Ã  risca os padrÃµes</a></li><li><a href="http://brunotorres.net/como-fazer-feeds-de-sites-dos-outros-com-php" rel="bookmark" class="crp_title">Como fazer feeds de sites dos outros com PHP</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://brunotorres.net/urls/feed</wfw:commentRss>
		<slash:comments>76</slash:comments>
		</item>
	</channel>
</rss>

