fix(header): el entorno se detecta en tiempo de ejecucion, no con un fichero .prod
`header.php` tenia un `if (1)` hardcodeado que se saltaba entera la comprobacion
de "pagina publicada". Para produccion se habia empezado a mantener una copia
`header.php.prod` que comentaba esas lineas con `#`.
ESA COPIA ESTABA MAL Y HABRIA TUMBADO TODAS LAS WEBS
Al comentar el `if(1){...}else{`, el cuerpo del `else` pasaba a ejecutarse SIEMPRE:
visitante normal, web PUBLICADA -> die(mantenimiento)
Es decir, cualquier visitante sin sesion `?pruebas` recibia la pagina de
mantenimiento aunque la web estuviera publicada. Verificado ejecutando las dos
versiones. Nadie lo vio porque un `.prod` **solo corre en produccion**: no hay
forma de que ese fallo aparezca antes de estar desplegado.
Ese es el argumento de fondo contra el enfoque `.prod`, mas alla de la
duplicacion: el camino de produccion no se puede probar. Con la condicion en
tiempo de ejecucion se ejercita en local escondiendo el `.acai` un segundo — que
es como se ha verificado este commit.
LA CONDICION, AHORA EXPLICITA
local -> siempre se ve (ahi no existe ni "publicada"
ni ?pruebas: son conceptos de produccion)
prod + publicada -> se ve
prod + sin publicar + ?pruebas -> se ve, con el cartel rojo
prod + sin publicar + visitante-> mantenimiento
DONDE VIVE `esEntornoLocal()`, QUE COSTO TRES INTENTOS
La señal es la PRESENCIA del `.acai` en la raiz: Forge lo escribe en cada copia
local y NUNCA viaja a produccion (esta en el `exclude` del manifest de push-core
y fuera de la allowlist del sync per-web). Se detecta LOCAL explicitamente y todo
lo demas es produccion: si la señal fallara, el comportamiento seguro es respetar
`pagina_publicada`.
Va en `funciones.php` y no en:
- `cms/` -> se sobrescribe al actualizar el core desde el CMS legacy
- `lib/variables.php`-> viaja en el sync PER-WEB (es el unico fichero de raiz que
lo hace), asi que cada web sobrescribe esa copia: una
funcion del nucleo ahi es la proxima divergencia
- un plugin -> `TokenGuard::isLocalTest()` hace esto mismo, pero el
nucleo no puede depender de que un plugin este cargado,
y builder_saas publica solo al editarlo
`funciones.php` es CORE (viaja en el manifest de push-core, como `header.php`) y
lo carga todo el front antes de usarlo.
VERIFICADO sobre una web real (cdn-ecommerce-base), no en un test aislado:
con .acai -> HTTP 200, 78104 bytes, la web entera, sin mantenimiento
sin .acai -> HTTP 200, 1943 bytes, pagina de mantenimiento
Sintaxis comprobada con el PHP 8.3 de Plesk, que es el del hosting.
OJO AL DESPLEGAR: esto hace que la pagina de mantenimiento EMPIECE A FUNCIONAR de
verdad. Hoy el `if (1)` la desactiva en todas las webs, produccion incluida, asi
que cualquier web con `pagina_publicada = 0` se esta viendo entera. Al llegar este
cambio, esas webs pasaran a mostrar mantenimiento — que es lo correcto, pero es un
cambio visible.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019gLX53DZJXGPFCf6DJTPWQ
This commit is contained in:
co-authored by
Claude Opus 5
parent
3747508812
commit
92f092dcc4
+30
-17
@@ -56,23 +56,36 @@ $config_header = array(
|
||||
'alternate' => @$alternate
|
||||
);
|
||||
|
||||
if (1){
|
||||
|
||||
if (@$customCode) echo modulo('custom-header',$config_header); else echo tpl('cabecera',$config_header);
|
||||
}else{
|
||||
if (!isset($_SESSION["pruebas"])){
|
||||
die(tpl('mantenimiento',$config_header));
|
||||
|
||||
}else{
|
||||
if (@$customCode) echo modulo('custom-header',$config_header); else echo tpl('cabecera',$config_header);
|
||||
if (isset($_SESSION["pruebas"])){
|
||||
if ($configuracionRecord["pagina_publicada"]==0){
|
||||
?>
|
||||
<div style="position:absolute;top:0px;width:150px;background-color:red;color:#fff;font-size:12px;padding:0 10px;z-index:99999999;transform:translateZ(1000px);">SITIO EN PRUEBAS</div>
|
||||
<?
|
||||
}
|
||||
}
|
||||
// Quien ve la web y quien ve la pagina de mantenimiento.
|
||||
//
|
||||
// En LOCAL/TEST (Forge) siempre se ve la web: ahi no existe el concepto de
|
||||
// "publicada" ni el modo `?pruebas`, que son solo de produccion.
|
||||
//
|
||||
// En PRODUCCION:
|
||||
// - publicada -> se ve
|
||||
// - sin publicar + ?pruebas -> se ve, con el cartel rojo
|
||||
// - sin publicar + visitante -> pagina de mantenimiento
|
||||
//
|
||||
// Antes esto era un `if (1)` hardcodeado que se saltaba la comprobacion entera,
|
||||
// con una copia `header.php.prod` que comentaba esas lineas para produccion. La
|
||||
// copia estaba MAL: al comentar el `if(1){...}else{`, el cuerpo del else pasaba a
|
||||
// ejecutarse siempre y un visitante normal de una web PUBLICADA recibia
|
||||
// `die(mantenimiento)`. Nadie lo vio porque ese fichero solo corria en
|
||||
// produccion. Con la condicion en tiempo de ejecucion el camino de produccion se
|
||||
// prueba en local tocando la señal.
|
||||
$verLaWeb = esEntornoLocal()
|
||||
|| @$configuracionRecord["pagina_publicada"]
|
||||
|| isset($_SESSION["pruebas"]);
|
||||
|
||||
if ($verLaWeb) {
|
||||
if (@$customCode) echo modulo('custom-header',$config_header); else echo tpl('cabecera',$config_header);
|
||||
// Aviso solo cuando de verdad estas mirando algo sin publicar (prod + pruebas).
|
||||
if (!esEntornoLocal() && isset($_SESSION["pruebas"]) && @$configuracionRecord["pagina_publicada"] == 0) {
|
||||
?>
|
||||
<div style="position:absolute;top:0px;width:150px;background-color:red;color:#fff;font-size:12px;padding:0 10px;z-index:99999999;transform:translateZ(1000px);">SITIO EN PRUEBAS</div>
|
||||
<?
|
||||
}
|
||||
|
||||
} else {
|
||||
die(tpl('mantenimiento',$config_header));
|
||||
}
|
||||
?>
|
||||
|
||||
Reference in New Issue
Block a user