🇯🇵 日本語 | 🇺🇸 English | 🇪🇸 Español | 🇵🇹 Português | 🇹🇭 ไทย | 🇨🇳 中文

[Introdução ao PHP] Alterne Páginas Livremente! Entendendo o Mecanismo ao Criar um Roteador Simples

Com o que aprendemos até agora, já somos capazes de obter informações de um banco de dados usando PHP e gerar páginas dinâmicas. No entanto, é normal que um site tenha várias páginas diferentes, como "Página Inicial", "Sobre Nós" e "Contato". Como podemos gerenciar eficientemente essas páginas, compartilhando elementos comuns como cabeçalhos e rodapés?

A resposta está em um conceito chamado "roteamento" (routing). O roteamento é um mecanismo que atua como "controle de tráfego", alternando o conteúdo a ser exibido de acordo com a URL que o usuário acessou. Neste artigo, criaremos um roteador muito simples em PHP usando parâmetros de URL como `index.php?page=about`. Ao tocar na parte central do que frameworks completos como o Laravel fazem nos bastidores, aprofundaremos nossa compreensão da estrutura de aplicações web e daremos um grande passo para o nosso próximo aprendizado!

Para preparar seu ambiente para rodar o PHP (ambiente de desenvolvimento), se você ainda não configurou o XAMPP, por favor, consulte [Introdução ao PHP] Um Guia Completo para Baixar e Instalar o XAMPP!. Após a instalação, basta colocar seu arquivo PHP na pasta especificada (como `htdocs`), e você estará pronto!

1. O que é o Mecanismo de Roteamento? Controle de Tráfego com PHP

O mecanismo de roteamento pode ser comparado a um recepcionista em um grande edifício. Todos os visitantes (usuários) chegam primeiro à mesma entrada principal (index.php). Então, eles dizem ao recepcionista (roteador) "Quero ir para o departamento XX (?page=about)". O recepcionista, então, os guia para o departamento apropriado (about.php) de acordo com o seu destino.

Para criar este mecanismo, usaremos os três elementos a seguir do PHP.

  1. Variável $_GET: Uma variável especial do PHP para receber o valor de `page` (neste caso, `about`) de uma "string de consulta" como ?page=about anexada ao final da URL.
  2. Instrução include: Um comando para ler e combinar o conteúdo de outro arquivo PHP em um local especificado. Isso permite que você compartilhe elementos comuns como cabeçalhos e rodapés.
  3. Função file_exists(): Uma função de segurança muito importante que verifica se o arquivo que você está tentando carregar realmente existe no servidor, caso uma URL maliciosa seja especificada.

Ao combinar essas partes, um roteador que alterna o conteúdo da tela de acordo com a URL é concluído.

2. Na Prática! Criando um Roteador Simples com 3 Arquivos

Agora, vamos criar um roteador simples. Desta vez, prepararemos os três arquivos a seguir e os salvaremos todos na mesma pasta.

Arquivo 1: index.php (Roteador e Layout)

Este arquivo é a "entrada principal" do nosso site. Ele tem partes comuns como navegação e uma área de exibição de conteúdo que muda de acordo com a URL. Este será o nosso "exemplo de HTML completo e funcional".

<!DOCTYPE html>
<html lang="pt">
<head>
    <meta charset="UTF-8">
    <title>Site com Roteador Simples</title>
    <style>
        body { font-family: sans-serif; line-height: 1.8; }
        .container { max-width: 800px; margin: 20px auto; padding: 20px; border: 1px solid #ddd; }
        nav { background: #f0f0f0; padding: 10px; margin-bottom: 20px; }
        nav a { margin-right: 15px; text-decoration: none; color: #0056b3; }
        nav a:hover { text-decoration: underline; }
        .content { border-top: 2px solid #eee; padding-top: 20px; }
        footer { margin-top: 30px; text-align: center; font-size: 0.9em; color: #777; }
        .not-found { color: red; font-weight: bold; }
    </style>
</head>
<body>
    <div class="container">
        <header>
            <h1>Site de Exemplo com Roteador Simples</h1>
        </header>
        <nav>
            <a href="index.php?page=home">Início</a>
            <a href="index.php?page=about">Sobre este site</a>
        </nav>

        <div class="content">
            <?php
            // 1. Obter o nome da página a ser exibida a partir do parâmetro da URL
            //    Se não houver parâmetro, 'home' é o padrão
            $page = $_GET['page'] ?? 'home';

            // 2. Lista de páginas permitidas (lista de permissões)
            $allowed_pages = ['home', 'about'];

            // 3. Verificar se o nome da página está na lista de permissões
            if (in_array($page, $allowed_pages)) {
                // 4. Criar o caminho do arquivo correspondente
                $file_path = $page . '.php';

                // 5. Verificação final se o arquivo existe antes de incluí-lo
                if (file_exists($file_path)) {
                    include($file_path);
                } else {
                    echo '<p class="not-found">Erro: Arquivo não encontrado.</p>';
                }
            } else {
                // Se uma página não permitida for especificada
                echo '<p class="not-found">404 Not Found: A página especificada não existe.</p>';
            }
            ?>
        </div>

        <footer>
            <p>© 2025 Simple Router Inc.</p>
        </footer>
    </div>
</body>
</html>

Arquivo 2: home.php (Conteúdo da Página Inicial)

Este é um arquivo que contém apenas o conteúdo da página inicial (top page), que será incluído no `index.php`.

<h2>Bem-vindo!</h2>
<p>Esta é a página inicial.</p>
<p>Quando você clica na navegação acima, o valor de ?page= na URL muda, e o conteúdo exibido é alterado.</p>

Arquivo 3: about.php (Conteúdo Sobre o Site)

Da mesma forma, este é o conteúdo que é carregado quando `index.php?page=about` é especificado.

<h2>Sobre este site</h2>
<p>Este site é uma amostra para aprender o mecanismo de um roteador simples em PHP.</p>
<p>O index.php serve como base, e carrega dinamicamente o conteúdo de diferentes arquivos como este about.php de acordo com o parâmetro da URL.</p>

Agora está tudo pronto. Tente acessar `index.php` em seu navegador. Você deve conseguir confirmar que cada vez que clica em um link de navegação, apenas o conteúdo central alterna entre "Início" e "Sobre este site".

3. Um Ponto a Ser Observado: Ataque de Travessia de Diretório

Ao criar um roteador simples por conta própria, uma coisa que você absolutamente deve saber é o ataque de **Travessia de Diretório (Directory Traversal)**. Se você escrever um código como o seguinte sem medidas de segurança, é muito perigoso.

<?php
// Exemplo ruim: Nunca imite isso!
$page = $_GET['page'];
include($page . '.php'); // Usando a entrada do usuário como está, sem validação
?>

Com este código, um invasor poderia especificar uma string especial na URL como `?page=../../../../etc/passwd`, potencialmente permitindo-lhes ler arquivos de configuração importantes do servidor que não deveriam ser acessados.

Para prevenir este ataque, nosso exemplo de `index.php` inclui uma verificação de duas etapas.

  1. Método de Lista de Permissões (Whitelist): Criar uma lista de permissões chamada `$allowed_pages` e verificar se o nome da página especificada está nela usando `in_array()`.
  2. Verificação de Existência do Arquivo: Mesmo que passe pela lista de permissões, como precaução, realizar uma verificação final para ver se o arquivo realmente existe com `file_exists()`.

Essa contramedida impede que arquivos não intencionais sejam carregados e aumenta a segurança.

4. Resumo e Próximos Passos

Desta vez, aprendemos o mecanismo de um roteador simples que alterna o conteúdo exibido usando parâmetros de URL e a instrução `include` do PHP. Você conseguiu ter uma noção de como um site inteiro pode ser construído com um único ponto de entrada, `index.php`, que lida com o controle de tráfego de acordo com a URL?

Na verdade, os frameworks modernos de PHP que usamos comumente, como Laravel e Symfony, fornecem uma versão mais avançada e segura deste mecanismo de roteamento. O conhecimento deste artigo é uma base importante para entender por que tais frameworks são necessários e o que está acontecendo por trás das cenas.

Como próximo passo, seria interessante tentar criar "**URLs amigáveis**" (pretty URLs) reescrevendo as URLs com um arquivo `.htaccess`, para tornar URLs como `index.php?page=about` mais bonitas, como `/about`. Isso certamente aprofundará sua compreensão de como a web funciona.