Publicar desde una carpeta distinta a public_html
Por defecto, un dominio publica public_html en tu directorio home. Los frameworks
de PHP modernos están construidos al revés: la aplicación vive en una carpeta
y solo una subcarpeta public/ dentro de ella está pensada para ser accesible desde la web.
El archivo .env —contraseña de base de datos, clave de la aplicación, credenciales de pago—
queda un nivel por encima, deliberadamente.
Si en cambio publicas todo el proyecto, /.env es una URL que cualquiera puede solicitar.
Elegir el document root es cómo evitas eso.
Configúralo
Domains → la fila del dominio → Document root.
Se te pide una carpeta dentro de tu directorio home, escrita de forma relativa a él:
app/public
no /home/you/app/public. Déjalo vacío para volver a public_html.
El panel crea la carpeta si aún no existe, reescribe la configuración del servidor web y la recarga. Cuando ha terminado te indica la ruta completa que ahora está publicando, y lo dice explícitamente si tuvo que crear la carpeta.
Una disposición típica después:
/home/you/
├── app/ <- the whole project: composer.json, .env, vendor/
│ └── public/ <- the only part served to the web
└── public_html/ <- the default, no longer used
Comprueba que funcionó
Carga el sitio. Luego pide el archivo que estabas protegiendo:
curl -sI https://yourdomain.com/.env
403 es la respuesta que quieres. Un 200 significa que el document root sigue por encima
de .env y el cambio no surtió efecto: recarga la página Domains y confirma
que la fila muestra la carpeta que escribiste.
Qué dominios tienen esto
- El dominio principal, los dominios adicionales y los subdominios tienen cada uno su propio document root y su propio botón Document root.
- Los dominios aparcados (alias) no. Un alias siempre sirve tu sitio web principal, que es lo que lo hace un alias. El panel lo dice: "A parked domain always serves your primary website. Change the primary document root instead, or convert this to an addon domain."
- Las redirecciones no. Una redirección no sirve nada propio.
Qué rechaza el panel, y por qué
El valor se comprueba antes de que llegue a nada privilegiado, y se comprueba de nuevo del otro lado. Los rechazos regresan como un mensaje en la página, y no se cambia nada.
| Escribiste | Por qué se rechaza |
|---|---|
/var/www/html, ~/app |
Debe ser relativo a tu home. Las rutas absolutas y ~ no se aceptan. |
../../etc, app/../.. |
El nombre de una carpeta no puede empezar por un punto, que es lo que hace .. imposible. Nada fuera de tu home es alcanzable, por construcción. |
.ssh, .git, .config |
La misma regla. Publicar .ssh pondría tus claves en la web; publicar .git pondría allí el historial de tu código. |
tmp |
Ahí viven tus archivos de sesión de PHP. Publicarlo significa publicar las sesiones de tus visitantes. |
logs, etc, mail, ssl, backups |
Usados por el panel para tu cuenta. |
a/b/c/d/e |
Como máximo cuatro niveles de profundidad. |
| cualquier cosa de más de 128 caracteres | Demasiado largo. |
Una comprobación más ocurre en el propio servidor: la carpeta se resuelve a través de cualquier
enlace simbólico y se vuelve a comprobar. Un symlink que apunte fuera de tu home se rechaza
en lugar de seguirse, de modo que ln -s / ~/app no se convierte en un sistema de archivos servido.
Certificados
Nada que hacer. Un certificado se emite para el dominio, no para la carpeta, y el document root que configures se relee en el momento en que se escribe un certificado, así que cambiarlo mientras se está configurando HTTPS es seguro. Un dominio adicional que ya tiene HTTPS lo conserva.
Cuando algo parece ir mal
El sitio muestra un listado de directorio o "index of /". La nueva carpeta aún no tiene
index.php ni index.html. Sube la aplicación, o apunta el
document root a la carpeta que sí tiene uno.
403 en cada página, no solo en .env. La carpeta existe pero el servidor web
no puede leer dentro de ella. Comprueba con el File Manager que la carpeta y sus padres
pertenecen a tu cuenta, especialmente si colocaste los archivos allí por SSH como
otro usuario.
404 en cada página y el sitio funcionaba hace un minuto. Recarga la página Domains
y lee la carpeta que se muestra en la fila. Un error tipográfico se publica exactamente como se escribió:
el panel crea la carpeta en lugar de adivinar, así que una carpeta nueva vacía es
la causa habitual. Vuelve a ponerlo en public_html, o en la carpeta correcta.
Cada página devuelve 500 con un error del framework sobre una clave faltante. Eso es
la aplicación, no el document root: se está llegando al framework. Para
Laravel esto suele ser un APP_KEY vacío.