Para entender qual mod_rewrite você precisa primeiro entender como um servidor da web funciona. Um servidor da web responde às solicitações HTTP . Uma solicitação HTTP em seu nível mais básico se parece com isso:
GET /foo/bar.html HTTP/1.1
Essa é a simples solicitação de um navegador para um servidor da Web que solicita a URL /foo/bar.html
dele. É importante ressaltar que ele não solicita um arquivo , solicita apenas uma URL arbitrária. A solicitação também pode ser assim:
GET /foo/bar?baz=42 HTTP/1.1
Essa solicitação é igualmente válida para um URL e obviamente não tem nada a ver com arquivos.
O servidor da Web é um aplicativo que atende a uma porta, aceitando solicitações HTTP que entram nessa porta e retornando uma resposta. Um servidor da Web é totalmente livre para responder a qualquer solicitação da maneira que achar melhor / da maneira que você configurou para responder. Esta resposta não é um arquivo, é uma resposta HTTP que pode ou não ter nada a ver com arquivos físicos em qualquer disco. Um servidor web não precisa ser o Apache, existem muitos outros servidores web, todos programas que são executados persistentemente e estão conectados a uma porta que responde a solicitações HTTP. Você pode escrever um você mesmo. Este parágrafo tinha como objetivo separar você de qualquer noção de que os URLs sejam iguais a arquivos diretamente, o que é realmente importante de entender. :)
A configuração padrão da maioria dos servidores da Web é procurar um arquivo que corresponda à URL no disco rígido. Se a raiz do documento do servidor estiver configurada para, por exemplo /var/www
, ele poderá verificar se o arquivo /var/www/foo/bar.html
existe e servi-lo, se houver. Se as extremidades de arquivo em ".php" que irá chamar o intérprete PHP e , em seguida, retornar o resultado. Toda essa associação é completamente configurável; um arquivo não precisa terminar em ".php" para o servidor Web executá-lo através do interpretador PHP, e a URL não precisa corresponder a nenhum arquivo específico no disco para que algo aconteça.
mod_rewrite é uma maneira de reescrever o tratamento de solicitações internas. Quando o servidor da web recebe uma solicitação para a URL /foo/bar
, você pode reescrevê-la em outra coisa antes que o servidor procure um arquivo no disco para corresponder a ele. Exemplo simples:
RewriteEngine On
RewriteRule /foo/bar /foo/baz
Esta regra diz que sempre que uma solicitação corresponder a "/ foo / bar", reescreva-a em "/ foo / baz". A solicitação será tratada como se /foo/baz
tivesse sido solicitada. Isso pode ser usado para vários efeitos, por exemplo:
RewriteRule (.*) $1.html
Essa regra corresponde a qualquer coisa ( .*
) e a captura ( (..)
), depois a reescreve para acrescentar ".html". Em outras palavras, se /foo/bar
foi o URL solicitado, ele será tratado como se /foo/bar.html
tivesse sido solicitado. Consulte http://regular-expressions.info para obter mais informações sobre correspondência, captura e substituição de expressões regulares.
Outra regra frequentemente encontrada é esta:
RewriteRule (.*) index.php?url=$1
Novamente, isso corresponde a qualquer coisa e a reescreve no arquivo index.php com a URL solicitada originalmente anexada no url
parâmetro de consulta. Ou seja, para todos e quaisquer pedidos que chegam, o arquivo index.php é executado e esse arquivo terá acesso ao pedido original $_GET['url']
, para que ele possa fazer o que quiser com ele.
Primeiramente, você coloca essas regras de reescrita no arquivo de configuração do servidor da web . O Apache também permite * que você os coloque em um arquivo chamado .htaccess
dentro da raiz do documento (ou seja, próximo aos arquivos .php).
* Se permitido pelo arquivo de configuração principal do Apache; é opcional, mas geralmente ativado.
O que mod_rewrite não faz
mod_rewrite não torna magicamente todos os seus URLs "bonitos". Este é um mal-entendido comum. Se você possui este link no seu site:
<a href="https://stackoverflow.com/my/ugly/link.php?is=not&very=pretty">
não há nada que o mod_rewrite possa fazer para tornar isso bonito. Para fazer deste um link bonito, você deve:
Mude o link para um link bonito:
<a href="https://stackoverflow.com/my/pretty/link">
Use mod_rewrite no servidor para manipular a solicitação para a URL /my/pretty/link
usando qualquer um dos métodos descritos acima.
(Pode-se usar mod_substitute
em conjunto para transformar páginas HTML de saída e seus links contidos. Embora isso seja geralmente mais esforço do que apenas atualizar seus recursos HTML.)
Há muito o que mod_rewrite pode fazer e regras de correspondência muito complexas que você pode criar, incluindo encadear várias reescritas, solicitações de proxy para um serviço ou máquina completamente diferente, retornar códigos de status HTTP específicos como respostas, redirecionar solicitações etc. É muito poderoso e pode ser usado para ótimo se você entender o mecanismo fundamental de solicitação e resposta HTTP. Ele não torna seus links automaticamente bonitos.
Consulte a documentação oficial para todos os sinalizadores e opções possíveis.