Files
acai-vscode-webbase/slug.php
2026-04-15 20:00:09 +01:00

402 lines
14 KiB
PHP
Executable File

<?
$sep = explode("?enlace=", @$_SERVER["REQUEST_URI"]);
if (@$sep[1]){
header("HTTP/1.1 301 Moved Permanently");
header("Location: http://".$_SERVER["HTTP_HOST"].$sep[0]."");
}
require_once "lib/variables.php";
$sufijo = ".html";
if (@$_REQUEST["tipo"]=="barra") $sufijo="";
// SISTEMA DE CACHE DE SLUGS PARA EVITAR CONSULTAS A LA BASE DE DATOS EN CADA PETICIÓN, SE ALMACENAN EN REDIS SI ESTÁ DISPONIBLE O EN MEMORIA SI NO
function slugCacheRedisKey($cacheKey){
return "SLUG_CACHE_".$_SERVER["HTTP_HOST"]."_".$cacheKey;
}
function slugRedisAvailable(){
static $available = null;
if (!is_null($available)) return $available;
if (!class_exists("CocoDB")) return false;
try{
CocoDB::initCache();
if (!@CocoDB::$redis) {
$available = false;
return $available;
}
if (!@CocoDB::$redis->isConnected()) {
$available = false;
return $available;
}
$available = true;
return $available;
}catch(Exception $e){
$available = false;
return $available;
}
}
function slugCacheRead($cacheKey){
global $slugRedisAvailable;
if (!$slugRedisAvailable) return null;
$redisKey = slugCacheRedisKey($cacheKey);
$rawRedis = CocoDB::cacheGet($redisKey);
if (!$rawRedis) return null;
$dataRedis = @json_decode($rawRedis,true);
return is_array($dataRedis) ? $dataRedis : null;
}
function slugCacheWrite($cacheKey,$data,$ttl = 0){
global $slugRedisAvailable;
if (!$slugRedisAvailable) return;
$redisKey = slugCacheRedisKey($cacheKey);
$expire = intval($ttl) > 0 ? intval($ttl) : null;
CocoDB::cacheSet($redisKey,json_encode($data),$expire);
}
function slugCacheDelete($cacheKey){
global $slugRedisAvailable;
if (!$slugRedisAvailable) return;
$redisKey = slugCacheRedisKey($cacheKey);
CocoDB::cacheSet($redisKey,"",1);
}
function slugRouteCacheKey($enlace){
return "slug-route-".md5($_SERVER["HTTP_HOST"]."|".$enlace);
}
function slugAliasCacheKey($aliasPath){
return "slug-alias-".md5($_SERVER["HTTP_HOST"]."|".$aliasPath);
}
function slugTranslationCacheKey($enlaceAux,$sufijo){
return "slug-translation-".md5($_SERVER["HTTP_HOST"]."|".$enlaceAux."|".$sufijo);
}
function slugGetCachedRoute($enlace){
$data = slugCacheRead(slugRouteCacheKey($enlace));
if (!is_array($data)) return null;
if (!@$data["expiresAt"] || intval($data["expiresAt"]) < time()) {
slugCacheDelete(slugRouteCacheKey($enlace));
return null;
}
return $data;
}
function slugSetCachedRoute($enlace,$data,$ttl = 120){
$ttl = max(5,intval($ttl));
$data["expiresAt"] = time() + $ttl;
slugCacheWrite(slugRouteCacheKey($enlace),$data,$ttl);
}
function slugGetCachedAlias($aliasPath){
$data = slugCacheRead(slugAliasCacheKey($aliasPath));
if (!is_array($data)) return null;
if (!@$data["expiresAt"] || intval($data["expiresAt"]) < time()) {
slugCacheDelete(slugAliasCacheKey($aliasPath));
return null;
}
return $data;
}
function slugSetCachedAlias($aliasPath,$data,$ttl = 120){
$ttl = max(5,intval($ttl));
$data["expiresAt"] = time() + $ttl;
slugCacheWrite(slugAliasCacheKey($aliasPath),$data,$ttl);
}
function slugGetCachedTranslation($enlaceAux,$sufijo){
$data = slugCacheRead(slugTranslationCacheKey($enlaceAux,$sufijo));
if (!is_array($data)) return null;
if (!@$data["expiresAt"] || intval($data["expiresAt"]) < time()) {
slugCacheDelete(slugTranslationCacheKey($enlaceAux,$sufijo));
return null;
}
return $data;
}
function slugSetCachedTranslation($enlaceAux,$sufijo,$data,$ttl = 120){
$ttl = max(5,intval($ttl));
$data["expiresAt"] = time() + $ttl;
slugCacheWrite(slugTranslationCacheKey($enlaceAux,$sufijo),$data,$ttl);
}
function slugGetTablesWithEnlace($database){
$cacheKey = "slug-tables-enlace-".md5($_SERVER["HTTP_HOST"]."|".$database);
$cacheData = slugCacheRead($cacheKey);
if (is_array($cacheData) && intval(@$cacheData["expiresAt"]) >= time() && is_array(@$cacheData["data"])) {
return $cacheData["data"];
}
$sql = "
SELECT DISTINCT TABLE_NAME,COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME IN ('enlace')
AND TABLE_SCHEMA='".mysql_real_escape_string($database)."'
";
$result = mysql_query($sql) or die(mysql_error());
$tables = array();
while($row = mysql_fetch_assoc($result)){
$tables[] = $row;
}
slugCacheWrite($cacheKey,array(
"expiresAt" => time() + 600,
"data" => $tables
),600);
return $tables;
}
// HASTA AQUI
$padre = 0;
$padreContenidos = false;
$controlador = "";
$tabla = null;
$registro = null;
$useInformationSchemaCache = defined("USE_INFORMATION_SCHEMA_CACHE") && USE_INFORMATION_SCHEMA_CACHE && class_exists("CocoDB");
$slugRedisAvailable = $useInformationSchemaCache ? slugRedisAvailable() : false;
$slugCacheEnabled = $useInformationSchemaCache && $slugRedisAvailable;
/********/
// GESTION DEL ALIAS
/********/
$aliasPath = "/".@$_REQUEST["enlace"].$sufijo;
$aliasData = $slugCacheEnabled ? slugGetCachedAlias($aliasPath) : null;
if (!is_array($aliasData)){
$aliasPathEscaped = mysql_real_escape_string($aliasPath);
$existe_alias = mysql_fetch_assoc(mysql_query("SELECT url_destino FROM cms_alias_urls WHERE url_alias = '".$aliasPathEscaped."' LIMIT 1"));
if (@$existe_alias && isset($existe_alias["url_destino"])) {
$aliasData = array(
"found" => true,
"url_destino" => $existe_alias["url_destino"]
);
if ($slugCacheEnabled) slugSetCachedAlias($aliasPath,$aliasData,300);
}else{
$aliasData = array("found" => false);
if ($slugCacheEnabled) slugSetCachedAlias($aliasPath,$aliasData,60);
}
}
if (@$aliasData["found"] && @$_REQUEST["enlace"]) {
$protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://";
header("HTTP/1.1 301 Moved Permanently");
if (strpos(@$aliasData["url_destino"],"http") > -1){
header("Location: ".$aliasData["url_destino"]."");
}else{
header("Location: ".$protocol.$_SERVER["HTTP_HOST"].$aliasData["url_destino"]."");
}
die();
}
$_REQUEST["enlace"] = str_replace("amp/", "", @$_REQUEST["enlace"]);
$enlace_aux = @$_REQUEST["enlace"];
if (@$_REQUEST["idioma"]) {
$enlace_aux = $_REQUEST["idioma"]."/".$enlace_aux;
$enlace_aux = str_replace($_REQUEST["idioma"]."/".$_REQUEST["idioma"]."/", $_REQUEST["idioma"]."/", $enlace_aux);
}
$translationData = $slugCacheEnabled ? slugGetCachedTranslation($enlace_aux,$sufijo) : null;
if (is_array($translationData) && isset($translationData["found"])) {
if (@$translationData["found"]){
$_REQUEST["enlace"] = @$translationData["enlace"];
$_REQUEST["idioma"] = @$translationData["idioma"];
}else{
$_REQUEST["idioma"]="";
}
}else{
$fieldValue = @$enlace_aux.$sufijo;
$fieldValueB64 = base64_encode($fieldValue);
$fieldValueB64Slash = base64_encode("/".$fieldValue);
$result = mysql_query("SELECT prefix,tableName,recordNum,fieldName FROM cms_traducciones
WHERE fieldValue IN ('".mysql_real_escape_string($fieldValue)."','".mysql_real_escape_string($fieldValueB64)."','".mysql_real_escape_string($fieldValueB64Slash)."')
AND fieldName = 'enlace'
AND tableName != 'builder_custom'
LIMIT 1");
$foundTranslation = false;
if ($result){
$record = mysql_fetch_assoc($result);
if ($record){
$tableName = "cms_".preg_replace("/[^a-zA-Z0-9_]/","",@$record["tableName"]);
$fieldName = preg_replace("/[^a-zA-Z0-9_]/","",@$record["fieldName"]);
$recordNum = intval(@$record["recordNum"]);
if ($tableName && $fieldName && $recordNum > 0){
$result2 = mysql_query("SELECT ".$fieldName." FROM ".$tableName." WHERE num=".$recordNum." LIMIT 1");
if ($result2){
$record2 = mysql_fetch_assoc($result2);
if (is_array($record2) && isset($record2[$fieldName])) {
$_REQUEST["enlace"] = (@$sufijo=="/") ? substr($record2[$fieldName],1,strlen($record2[$fieldName])-2) : substr(str_replace($sufijo,"",$record2[$fieldName]),1,10000);
$_REQUEST["idioma"] = @$record["prefix"];
$foundTranslation = true;
}
}
}
}
}
if ($foundTranslation){
if ($slugCacheEnabled){
slugSetCachedTranslation($enlace_aux,$sufijo,array(
"found" => true,
"enlace" => @$_REQUEST["enlace"],
"idioma" => @$_REQUEST["idioma"]
),300);
}
}else{
$_REQUEST["idioma"]="";
if ($slugCacheEnabled){
slugSetCachedTranslation($enlace_aux,$sufijo,array(
"found" => false
),60);
}
}
}
$enlace = "/".@$_REQUEST["enlace"].$sufijo;
$enlaceEscaped = mysql_real_escape_string($enlace);
$routeFromCache = $slugCacheEnabled ? slugGetCachedRoute($enlace) : null;
$routeResolved = false;
if (is_array($routeFromCache) && isset($routeFromCache["found"])) {
if (@$routeFromCache["found"]) {
$tablaCache = @$routeFromCache["tabla"];
$registroCache = intval(@$routeFromCache["registro"]);
if ($tablaCache && $registroCache) {
$encontrado = mysql_fetch_assoc(mysql_query("SELECT * FROM ".$tablaCache." WHERE num=".$registroCache." AND enlace='".$enlaceEscaped."' LIMIT 1"));
if (@$encontrado){
$tabla = $tablaCache;
$registro = intval($encontrado["num"]);
$padre = intval(@$encontrado["parentNum"]);
if (isset($encontrado["layout"])&&$padre) $padreContenidos = mysql_fetch_assoc(mysql_query("select * from ".$tabla." where num=".$padre." AND layout=1 LIMIT 1")) ? true : false;
$controlador = @$encontrado["controlador"];
$routeResolved = true;
}else{
slugCacheDelete(slugRouteCacheKey($enlace));
}
}
}else{
$routeResolved = true;
}
}
if (!$routeResolved){
if ($slugCacheEnabled){
$resultados = slugGetTablesWithEnlace($SETTINGS["mysql"]["database"]);
}else{
$sql = "
SELECT DISTINCT TABLE_NAME,COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME IN ('enlace')
AND TABLE_SCHEMA='".mysql_real_escape_string($SETTINGS["mysql"]["database"])."'
";
$result = mysql_query($sql) or die(mysql_error());
$resultados = array();
while($row = mysql_fetch_assoc($result)){
$resultados[] = $row;
}
}
foreach($resultados as $record){
$tableName = isset($record["TABLE_NAME"]) ? $record["TABLE_NAME"] : @$record["table_name"];
$columnName = isset($record["COLUMN_NAME"]) ? $record["COLUMN_NAME"] : @$record["column_name"];
if (!$tableName || !$columnName) continue;
$encontrado = mysql_fetch_assoc(mysql_query("SELECT * FROM ".$tableName." WHERE ".$columnName."='".$enlaceEscaped."' LIMIT 1"));
if (@$encontrado){
$tabla = $tableName;
$registro = $encontrado["num"];
$padre = intval(@$encontrado["parentNum"]);
if (isset($encontrado["layout"])&&$padre) $padreContenidos = mysql_fetch_assoc(mysql_query("select * from ".$tableName." where num=".$padre." AND layout=1 LIMIT 1")) ? true : false;
$controlador = @$encontrado["controlador"];
if ($columnName!="enlace") {
$controlador="reserva.php";
}
}
}
if ($slugCacheEnabled){
if (@$tabla && @$registro){
slugSetCachedRoute($enlace,array(
"found" => true,
"tabla" => $tabla,
"registro" => intval($registro)
),300);
}else{
slugSetCachedRoute($enlace,array(
"found" => false
),60);
}
}
}
/*var_dump(CocoDB::$force_redis_html);
var_dump($_SERVER["REQUEST_URI"]);*/
if (class_exists("CocoDB") && isset(CocoDB::$force_redis_html) && CocoDB::$force_redis_html){
$hash = CocoDB::cacheGenerateHash("HTML_".md5(json_encode($_REQUEST)));
$data2 = CocoDB::cacheGet($hash);
if (@$data2) {
echo CocoDB::replaceHooksToken($data2);
die();
}
}
$resultInclude = null;
ob_start();
if (!@$tabla){
$num=0;
addPlugins("slug", $pluginData);
include("apartados.php");
}else{
$schema = loadSchema($tabla);
if (@$schema["controller"]!=""&&@$schema["controller"]!="apartados.php"){
if (@$registro) {
$num=$registro;
if (@$num && !@$_REQUEST["num"]) $_REQUEST["num"] = $num;
$pluginData = array("num" => $registro, "tabla" => $tabla, "schema" => $schema);
addPlugins("slug", $pluginData);
}
if (@$controlador){
include(dirname(__FILE__)."/".$controlador);
}else{
include(dirname(__FILE__)."/".$schema["controller"]);
}
}else{
$num=$registro;
if (@$num && !@$_REQUEST["num"]) $_REQUEST["num"] = $num;
$pluginData = array("num" => $registro, "tabla" => $tabla, "schema" => $schema);
addPlugins("slug", $pluginData);
if (!@$padre){
if (@$controlador){
$num=(@$_REQUEST["num"]) ? $_REQUEST["num"] : @$registro;
if (@$num && !@$_REQUEST["num"]) $_REQUEST["num"] = $num;
include(dirname(__FILE__)."/".$controlador);
}else{
include(dirname(__FILE__)."/apartados.php");
}
}else{
$familia = $padre;
if (@$controlador){
$num=(@$_REQUEST["num"]) ? $_REQUEST["num"] : @$registro;
if (@$num && !@$_REQUEST["num"]) $_REQUEST["num"] = $num;
include($controlador);
}else{
if ($padreContenidos){
include(dirname(__FILE__)."/contenidos.php");
}else{
include(dirname(__FILE__)."/apartados.php");
}
}
}
}
}
$resultInclude = ob_get_clean();
addPlugins("pre_render",$resultInclude);
if (class_exists("CocoDB") && isset(CocoDB::$force_redis_html) && CocoDB::$force_redis_html && @$hash){
CocoDB::cacheSet(@$hash,$resultInclude);
}
if (!detect_error_on_code($resultInclude) ){
echo $resultInclude;
}else{
echo error_html($resultInclude);
}
?>