Como apontar um subdomínio do cPanel para uma pasta fora do public_html, quando isso é permitido, e como proteger o código do sistema mesmo sem essa opção.
Todo domínio e subdomínio no cPanel tem uma pasta raiz (document root): é a pasta cujo conteúdo aparece no navegador. Por padrão, o cPanel exige que essa pasta fique dentro do public_html, como public_html/loja para loja.seudominio.com.br. Desenvolvedores às vezes pedem uma pasta fora dele, como /home/minhaconta/loja.seudominio.com.br, para separar os sites ou deixar o código fora do alcance do navegador.
Quem decide se pode: a configuração do servidor
A trava é uma opção do WHM chamada Restrict document roots to public_html, que vale para o servidor inteiro e vem ligada de fábrica. Só o administrador do servidor (acesso root) consegue mudá-la. Na prática:
- Hospedagem compartilhada ou revenda: você não altera essa opção. Se o seu projeto exige pasta fora do
public_html, consulte o suporte antes, ou use a alternativa segura mais abaixo, que resolve a maioria dos casos. - VPS ou servidor dedicado com WHM: você mesmo pode liberar, como mostrado a seguir.
Como liberar no WHM (VPS ou dedicado)
- Entre no WHM como root e abra Server Configuration » Tweak Settings.
- Vá na aba Domains e localize Restrict document roots to public_html. Se preferir, digite o nome no campo de busca da página.
- Mude para Off e clique em Save no fim da página.
Como criar o subdomínio com a pasta escolhida
- No cPanel, abra Domains (Domínios) e clique em Create A New Domain.
- Digite o subdomínio completo, como
loja.seudominio.com.br. - Desmarque Share document root para liberar o campo Document Root.
- Informe a pasta. Com a trava ligada, só são aceitas pastas dentro do
public_html, comopublic_html/loja. Com a trava desligada, você pode usar algo comoloja.seudominio.com.br, que fica em/home/minhaconta/loja.seudominio.com.br. - Clique em Submit. Para mudar a pasta depois, clique em Manage na linha do domínio.
A alternativa segura que funciona em qualquer plano
Na maioria das vezes, o objetivo real não é a pasta raiz ficar fora do public_html, e sim que o código do sistema (configurações, senhas, bibliotecas) não possa ser baixado pelo navegador. Isso dá para fazer sem mexer em nenhuma trava, porque você pode guardar arquivos em qualquer lugar da sua home; só a pasta pública precisa estar dentro do public_html:
- Envie o sistema para fora do public_html, por exemplo
/home/minhaconta/meuapp. - Crie o subdomínio apontando para uma pasta pública vazia, como
public_html/meuapp. - Copie para ela só os arquivos públicos do sistema (em frameworks como Laravel, o conteúdo da pasta
public:index.php,.htaccess, CSS, JS e imagens). - Ajuste os caminhos no index.php para apontar para a pasta de fora. No Laravel, troque
__DIR__.'/../por'/home/minhaconta/meuapp/em todas as linhas que usam esse caminho (as que carregamstorage,vendor/autoload.phpebootstrap/app.php).
Assim o .env, as configurações e o código ficam fora da web, e o subdomínio mostra só o que precisa.
public_html/meuapp/public com o sistema inteiro em public_html/meuapp. O subdomínio fica certo, mas o domínio principal passa a exibir o código: qualquer um pode tentar abrir seudominio.com.br/meuapp/.env.Problemas comuns
O cPanel recusa a pasta ou recoloca o public_html no começo
A trava Restrict document roots to public_html está ligada no servidor. Use uma pasta dentro do public_html ou a alternativa segura acima.
Subdomínio abre "Index of /" ou página em branco
A pasta raiz está vazia ou sem index.php/index.html. Confira em Domains » Manage qual pasta o subdomínio usa.
Subdomínio novo não abre
Se o DNS do domínio está em outro provedor, como a Cloudflare, crie lá também o registro do subdomínio apontando para a hospedagem. O SSL do subdomínio é emitido quando o DNS já aponta certo.