diff --git a/README.md b/README.md
index 4abc521..1d2af70 100644
--- a/README.md
+++ b/README.md
@@ -48,10 +48,17 @@ e resetar senha, com controle de acesso gerenciado pela própria aplicação.
- `sql/schema.sql` — schema do banco (admins, settings, audit_log, login_attempts).
- `storage/` — log de auditoria em arquivo (complementar ao banco).
+## URLs amigáveis
+
+O `public_html/.htaccess` esconde a extensão `.php` (requer `mod_rewrite` e
+`AllowOverride FileInfo`/`Limit` no vhost, já presentes na config desse site):
+`/dashboard`, `/admins`, `/auditoria`, `/settings`, `/logout` etc. em vez de
+`dashboard.php`, `admins.php`... Acessar o `.php` direto redireciona pra URL limpa.
+
## Papéis
-- **admin**: tudo que operador pode, mais gerenciar `admins.php` e `settings.php`.
-- **operador**: só habilita/desabilita aluno e reseta senha no `dashboard.php`.
+- **admin**: tudo que operador pode, mais gerenciar administradores e configurações.
+- **operador**: só habilita/desabilita aluno e reseta senha no dashboard.
A autenticação de quem usa o sistema é sempre feita com login e senha do próprio AD
(bind LDAP) — o banco **não armazena nenhuma senha**. A tabela `admins` só guarda
diff --git a/public_html/.htaccess b/public_html/.htaccess
new file mode 100644
index 0000000..2da6d70
--- /dev/null
+++ b/public_html/.htaccess
@@ -0,0 +1,27 @@
+RewriteEngine On
+RewriteBase /
+
+# Esconde a extensão .php: se alguém acessar /dashboard.php direto, redireciona
+# pra /dashboard (sem expor o nome do arquivo em links/histórico).
+RewriteCond %{THE_REQUEST} \s/+([^.\s]+)\.php[\s?] [NC]
+RewriteRule ^ /%1 [R=301,L]
+
+# Bloqueia acesso a qualquer coisa fora de public_html através de URL,
+# mesmo sem rewrite (defesa extra, já que src/config/storage ficam um
+# nível acima e não deveriam ser alcançáveis mesmo sem isso).
+RewriteRule ^(src|config|storage|sql)(/|$) - [F,L]
+
+# Roteia /algumacoisa para algumacoisa.php quando o arquivo existir e
+# nenhum arquivo/diretório real com esse nome exista.
+RewriteCond %{REQUEST_FILENAME} !-f
+RewriteCond %{REQUEST_FILENAME} !-d
+RewriteCond %{DOCUMENT_ROOT}/$1.php -f
+RewriteRule ^([a-zA-Z0-9_-]+)$ $1.php [L,QSA]
+
+# Nunca serve .htaccess/.env ou outro arquivo de config por engano.
+# (Options -Indexes não entra aqui de propósito: o AllowOverride do vhost
+# não libera o contexto "Options", só FileInfo/AuthConfig/Limit -- colocar
+# a diretiva aqui derrubaria o site com "Options not allowed here".)
+