Sistema de Redirección Completo

Sistema para redirigir la aplicación de pedidos de ingeleco, distribuido en dos aplicaciones.

1. Contenido del redireccionador.


1. IP Logger: Aplicación diseñada para instalarse en el servidor cuya IP se ha de registrar.

2. redirigirIngeleco: Aplicación pensada para instalarse en el directorio fabricomiweb.com/redirigirIngeleco/ del servidor Linux.


2. Funcionamiento


Este sistema de registro y redirección se ha construido siguiendo el siguiente diagrama:

Diagrama


2.1. IP Logger


El archivo index.php ejecuta una serie de instrucciónes, en el siguiente orden:

  1. Conecta con la base de datos.

  2. Solicita su IP pública a un servicio externo, localizado en https://vera.fabricomiweb.com/ip-redirect/ip-json.php.

  3. Consulta la dirección IP registrada en la base de datos con ID = 1.

  4. Si en la base de datos no existe un registro con esta ID, registra la dirección IP.

  5. Si el registro con ID = 1 coincide exactamente con la dirección IP actual, el programa finaliza la ejecución.

  6. Si el registro con ID = 1 no coincide con la dirección IP actual, Modifica el registro con ID = 1 con el valor de la dirección IP actual.

  7. Cierra la conexión y termina la ejecución.

2.2. Redirigir Ingeleco.


El archivo index.php ejecuta las siguientes instrucciones:

  1. Consulta en la Base de datos la dirección IP registrada cuyo ID = 1.

  2. Redirecciona a una dirección con la siguiente estructura:

    • https://{direccion-ip}/pedidos/

3. Instalación.


3.1. IP Logger.


Una vez alojados los archivos en el Servidor Windows se ha de programar una tarea para que el servidor ejecute el archivo index.php cada minuto:

  • En Herramientas, Seleccionar la opción Programador de Tareas.
  • En Configuración avanzada Se podrá seleccionar que la tarea se ejecute indefinidamente. El intervalo mínimo de ejecución que permite Windows Server 2016 Stardad Evaluation es de 5 minutos. En otras versiones, el intervalo mínimo entre ejecuciones se puede reducir hasta 1 minuto.
  • En Acción Seleccionar la opción Iniciar un programa.
  • En Programa o script, seleccionar index.php dentro del directorio ipLogger.

Si es necesario ejecutar la tarea con un intervalo menor, se tendrá que modificar el archivo index.php con la siguiente estructura:

while (true){
    insertarDatos();
    sleep(20)
}

siendo la función sleep(20) la que determinará cada cuántos segundos se ejecuta la aplicación.

Para ejecutarla, se deberá hacer a través de la terminal:

php index.php

3.2. redirigirIngeleco.


En el fabricomiweb.com, subir el directorio redirigirIngeleco. Al buscar la dirección https://fabricomiweb.com/redirigirIngeleco/ el navegador redireccionará a la aplicación de pedidos de Ingeleco.

4. Código.

IP Logger:

Conexion.php

<?php

//print_r(PDO::getAvailableDrivers()); //comprobar que el driver de firebird está instalado correctamente.
function conectarBaseDatos() {
try {
    $host = 'vera.fabricomiweb.com';
    $puerto = 'placeholder';
    $dbnombre= 'placeholder';
    $usuario = 'placeholder';
    $pass = 'placeholder';

    //la url quedaría así
    $url = "mysql:host=$host;port=$puerto;dbname=$dbnombre;charset=utf8mb4";

    //Creamos el objeto PDO:
    $conexion = new PDO($url, $usuario, $pass, [
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
    ]);
    //echo "conexión realizada con éxito";
} catch (\Throwable $th) {
    echo "Error en la conexión: " . $th->getMessage();
}

return $conexion;
}

retornar-ip.php

<?php
/**
 * Consulta la IP pública del servidor y la devuelve como string.
 */
function obtenerIpPublicaServidor(): ?string {
    $ip = @file_get_contents('https://vera.fabricomiweb.com/ip-redirect/ip-json.php');
    $response = json_decode($ip, true);
    if (isset($response['ip'])) {

        return $response['ip'];
    }
    return null;
}

select-ip.php

<?php require_once 'retornar-ip.php'; require_once 'conexion.php';


/** Realiza una consulta a la base de datos para obtener la IP registrada con ID = 1 */
function obtenerIpRegistrada() {
    $conexion = conectarBaseDatos();
    try {
        $sql = "SELECT IP_INGELECO FROM INGELECO_IP_LOG WHERE ID = 1";
        $stmt = $conexion->prepare($sql);
        $stmt->execute();
        $resultado = $stmt->fetch(PDO::FETCH_ASSOC);
        return $resultado ? $resultado['IP_INGELECO'] : null;
    } catch (\Throwable $th) {
        echo "Error al obtener la última IP registrada: " . $th->getMessage() . "\n";
        return null;
    }
}

insert-ip.php

<?php require_once 'conexion.php'; require_once 'retornar-ip.php'; require_once 'select-ip.php';
 
 function insertarDatos(){
    $conexion = conectarBaseDatos();
    $ipPublica = obtenerIpPublicaServidor();
    $ultimoRegistro = obtenerIpRegistrada();

    if(isset($ipPublica) && $ultimoRegistro != null){
        if ($ipPublica != $ultimoRegistro) {
            try {
            $sql = "UPDATE INGELECO_IP_LOG SET IP_INGELECO = :ipPublica WHERE ID = 1";
            $stmt = $conexion->prepare($sql);
            $stmt->bindParam(':ipPublica', $ipPublica, PDO::PARAM_STR);
            if ($stmt->execute()) {
                echo "IP actualizada correctamente \n" . $ipPublica;
            }
        } catch (\Throwable $th) {
            echo "\nError: " . $th;
        }
        } else {
            echo "La IP es idéntica y no se ha agregado \n";
        }
    } else {
        try {
        $sql = "INSERT INTO INGELECO_IP_LOG (IP_INGELECO) VALUES (:ipPublica)";
            $stmt = $conexion->prepare($sql); 
            $stmt->bindParam(':ipPublica', $ipPublica, PDO::PARAM_STR);
            $stmt->execute();
            echo "\nIP registrada correctamente: " . $ipPublica . "\n";

        } catch (\Throwable $th) {
            echo "\nError: " . $th->getMessage();
        }
    }
    die();
    }

<?php require 'src/insert-ip.php';

insertarDatos();

redirigirIngeleco:

index.php

<?php require_once 'conexion.php';

function obtenerUltimaIpRegistrada() {
    $conexion = conectarBaseDatos() ;
    try {
        $sql = "SELECT IP_INGELECO FROM INGELECO_IP_LOG WHERE ID = 1";
        $stmt = $conexion->prepare($sql);
        $stmt->execute();
        $resultado = $stmt->fetch(PDO::FETCH_ASSOC);
        return $resultado ? $resultado['IP_INGELECO'] : null;
    } catch (\Throwable $th) {
        echo "Error al obtener la última IP registrada: " . $th->getMessage() . "\n";
        return null;
    }
}

//* Redirige a la web de Ingeleco Usando la siguiente estructura de URL: https://IP/pedidos/ */
function redireccionarWeb() {
    $ipPublica = obtenerUltimaIpRegistrada();
    $url = "https://$ipPublica/pedidos/";
    header("Location: $url");
    echo "Redirigiendo a: $url\n";
}

redireccionarWeb();

conexion.php

El código de el archivo de conexión es idéntico a su homónimo de ipLogger

Deja una respuesta