Toda requisição ao site passa pelo mesmo caminho. Entendê-lo explica quase todo o comportamento do Conn2Flow: por que uma página vem do banco, quando o módulo roda, em que momento as variáveis @[[…]]@ são trocadas e por que um 404 vira redirecionamento.
1. Front-controller
A pasta pública tem só dois arquivos, gravados pelo instalador:
-
.htaccess(Apache) força HTTPS (se escolhido) e manda tudo que não é arquivo ou pasta real paraindex.php?_gestor-caminho=<caminho>. No Nginx, o bloco de exemplo gerado na instalação faz o mesmo. -
index.phpdefine$_INDEX['sistemas-dir'](a pasta do Gestor, fora da pasta pública) e incluigestor.php.
2. gestor.php e config.php
gestor.php inclui config.php, que:
-
lê o
.envdeautenticacoes/<domínio>/; -
preenche
$_GESTOR(caminhos, URL raiz, idiomas, versões),$_BANCOe$_CONFIG(sessão, cookies, segurança, captcha, e-mail…); -
carrega as bibliotecas básicas (
banco,gestor,modelo,hooks).
Depois chama gestor_start(), a sequência inteira:
gestor_start()
├─ gestor_cabecalhos_seguranca() nosniff, Referrer-Policy, X-Frame-Options, HSTS (em HTTPS), CSP (se configurada)
├─ gestor_config() caminho, idioma, arquivos estáticos, _api, _gateways
├─ gestor_sessao_iniciar() cookie de sessão
├─ seguranca_csrf_requisicao_validar() → gestor_csrf_resposta_invalida() (403) se falhar
└─ gestor_roteador() página, permissão, módulo, montagem e saída3. gestor_config(): caminho e desvios
-
_gestor-caminhoé validado porgestor_caminho_publico_valido()(sem.., byte nulo ou\, mesmo depois de decodificado até 3 vezes). Caminho inválido encerra com 400. -
Idioma na URL: se o primeiro segmento é um idioma de
LANGUAGES(/en/docs/…), ele viralinguagem-codigo, sai do caminho e entra emurl-raiz. Sem idioma na URL, vale o cookie de idioma; senão,LANGUAGE_DEFAULT. -
Caminho com extensão (
.js,.css,.png,.txt…) vai para o controladorarquivo-estatico, que serve degestor/assets/, dos módulos ou decontents/(arquivos enviados) e encerra. -
_api/…vai paracontroladores/api/api.phpe_gateways/…paracontroladores/plataforma-gateways/. Os dois têm autenticação própria (token ou assinatura), não passam pelo roteador de páginas e ficam isentos de CSRF.
4. Sessão e CSRF
-
gestor_sessao_iniciar()garante o cookie de sessão. A sessão fica no banco; veja gestor.php → Sessão. -
O CSRF vale para POST/PUT/PATCH/DELETE de quem tem o cookie de autenticação. O token vai em
<meta name="csrf-token">e emgestor.csrfToken, e oglobal.jso anexa afetch,$.ajaxeXMLHttpRequeste o renova sozinho quando expira (req-175). Requisições GET não são verificadas.
5. gestor_roteador(): da URL à página
-
Lê os parâmetros de controle:
ajax,ajaxOpcao(→ajax-opcao),opcao,ajaxPagina,ajaxWidgets,paginaIframeeajaxRegistroId. -
Rotas de sistema:
_gestor-cookie-verify/(prova de cookie) e a rota que devolve um token CSRF novo (gestor_roteador_csrf_token()). -
Acesso restrito ao site (
gestor_roteador_acesso_restrito()): comSITE_RESTRICTED_ACCESSligado, quem não está logado vai para/signin/, exceto nas rotas isentas. -
Busca a página na tabela
paginas:caminhoigual, idioma atual,tiposistemaoupagina,status='A', dentro da janeladata_publicacao_inicio/fim. Se não achar no idioma atual, aceita a mesma rota em qualquer idioma. -
O filtro
hook_apply_filters('gestor', 'roteador.paginas', $paginas)permite a um plugin ou projeto trocar o resultado. Com o Live Editor, um backup restaurado pode substituir o HTML (gestor_site_toolbar_backup_aplicar()). -
Página não encontrada:
gestor_roteador_301_ou_404()procura o caminho empaginas_301. Se ele pertenceu a uma página ativa, responde 301 para o caminho atual dela; senão, redireciona para/404/. A página404/em si é servida com status 404. Em AJAX, a resposta é JSON{"error":"404"}.
6. Permissão
Se a página não tem sem_permissao, o roteador chama gestor_permissao():
-
gestor_permissao_token()valida o login. O cookie de autenticação guarda um token cuja assinatura é oheader.payloadcifrado com a chave RSA do site; o servidor o confere decifrando com a chave privada (gestor_permissao_validar_jwt()). Depois exige que opubIDexista emusuarios_tokens, com o HMACUSUARIO_HASH_PASSWORD, dentro da validade. Renova o token a cadaCOOKIE_RENEWTIMEe confere User-Agent e IP contra roubo de sessão. O resultado é memorizado por requisição. -
Sem login: a rota atual é guardada para voltar depois do login, e a resposta é 401 →
/signin/(em AJAX, JSON comcode: AUTH_REQUIREDe o cabeçalhoX-Gestor-Auth-Redirect). -
gestor_permissao_modulo()confere se o perfil do usuário tem o módulo da página (usuarios_perfis_modulos, ou os perfis de gestor de host). Sem permissão: 401 →/dashboard/. -
Robôs de redes sociais numa página protegida recebem só o
<head>com OpenGraph (gestor_roteador_crawler_pagina_protegida()), para o link ter prévia sem vazar conteúdo.
Dentro do código, use:
-
gestor_usuario()para o usuário atual (anônimo:id_anonimo,id_usuarios0); -
gestor_acesso('operacao', 'modulo')para uma operação específica. Se a operação não estiver cadastrada emmodulos_operacoes, basta ter o módulo.
7. Execução do módulo
A página pode apontar um modulo (e um plugin). O roteador então inclui gestor/modulos/<modulo>/<modulo>.php (ou o do plugin), que termina chamando <modulo>_start().
-
Requisição AJAX: o módulo responde preenchendo
$_GESTOR['ajax-json'], que o roteador devolve como JSON. Sem resposta, o erro é 500 ("No response data set").-
Numa página sem permissão, o arquivo incluído é
<modulo>.ajax.public.php, o único jeito de ter AJAX público. -
Com
ajaxPagina, o HTML da página é carregado junto. -
ajaxWidgetsaciona o AJAX dos widgets (gestor_pagina_widgets_ajax()).
-
-
Requisição normal com
opcao(por exemplo, um POST para?opcao=salvar): o módulo roda e o roteador redireciona para a página raiz do módulo. -
Requisição normal sem
opcao: o HTML da página (do banco, ou dos arquivos deresources/em desenvolvimento) vira$_GESTOR['pagina'], e então o módulo roda e pode alterá-la. -
Sem
modulomas comopcao, rodagestor/modulos/global.php.
8. Montagem do HTML
Depois do módulo, nesta ordem:
-
gestor_componentes_incluir_pagina(): componentes marcados. -
Layout: o de
$_GESTOR['layout'](definido pelo módulo), olayout_idda página (layout-iframescompaginaIframe) ou nenhum. -
gestor_pagina_recursos_incluir()do layout e da página (CSS pré-compilado, compilado, autoral ehtml_extra_head). -
Dados do seletor de idioma, se ativo.
-
gestor_pagina_layout(): a página entra no@[[pagina#corpo]]@do layout, e<!-- pagina#titulo -->vira<title>. -
gestor_pagina_widgets(): cada<!-- widgets#modulo->funcao({...}) < -->…<!-- … > -->(e a forma antiga@[[widgets#…]]@) é trocado pelo HTML do widget. -
Barra do Live Editor (só para editores logados), PDF.js e CSS do Quill, só nas páginas que os usam.
-
gestor_pagina_css()egestor_pagina_extra_head_e_javascript()preenchem<!-- pagina#css -->e<!-- pagina#js -->, com o objeto globalgestor(versões, raiz, idioma, módulo, CSRF,javascript-vars), OpenGraph, SEO e robots. -
gestor_pagina_variaveis()troca os marcadores@[[…]]@, na ordem:-
os de sistema:
pagina#url-raiz,pagina#titulo,pagina#menu,usuario#nome,gestor#versao…; -
as variáveis de texto (globais, do módulo, dos módulos extras).
-
-
gestor_pagina_ultimas_operacoes()aplica os marcadores finais (pagina-marcadores-finais), remove linhas vazias e, em produção, higieniza o HTML (sem comentários nem indentação). -
Saída com
Content-Type: text/htmleexit.
Detalhes e legado
-
?hotfixem qualquer URL faz o roteador responder "Hotfix Done!" e encerrar (gestor_hotfix()), resto de um mecanismo antigo. -
gestor_permissao_fingerprint()existe, mas a verificação por fingerprint está comentada emgestor_permissao(). -
gestor_pagina_css_incluir($css)com um CSS explícito empilha o valor na fila de JavaScript (javascript-fim), não na de CSS. Só a chamada sem argumento (ocss.cssdo módulo) funciona como o nome sugere. -
gestor_pagina_menu()egestor_pagina_menu_icone()montam o menu lateral do painel administrativo (@[[pagina#menu]]@) a partir dos módulos e grupos permitidos ao perfil.
Veja também
-
Biblioteca gestor.php: sessão, redirecionamento, recursos de página e higienização.
-
Biblioteca interface.php: o que acontece dentro de um módulo de CRUD.