Autonomía digital y tecnológica

Código e ideas para una internet distribuida

Cómo redirigir todas las URLs de un sitio web cuando se cambia de dominio usando htaccess

Imago voragine.net
[actualizado el ] • Por Enlace permanente

Si un sitio web cambia de dominio pero la estructura de enlaces se mantiene es una buena práctica redirigir cada uno de los contenidos en el viejo dominio a su homónimo en el nuevo. Esto se puede conseguir añadiendo unas reglas al archivo .htaccess.

Supongamos que el nuevo dominio es example.net y el antiguo domain.com:

RewriteEngine on 
RewriteCond %{HTTP_HOST} ^www.domain.com$[OR]
RewriteCond %{HTTP_HOST} ^domain.com$ [NC]
RewriteRule ^(.*)$ http://example.net$1 [R=301,L]

Solución encontrada en una de las respuestas del hilo .htaccess redirect all pages to new domain de stackoverflow, mejorada con algunos detalles de este otro hilo.

Una manera ligera y responsive de poner una imagen de fondo a pantalla completa en una web

Pequeño snippet de CSS para conseguir una web con una imagen de fondo a pantalla completa. La solución funciona en todo tipo de dispositivos, escritorio y móviles.

html, body { overflow: hidden; height: 100%;}
body {margin: 0; padding: 0; background: #ffffff url("bg.png") repeat-x 50% 50% / contain;}

El último parámetro de background, / contain, es background-size y define cómo se comporta la imagen en diferentes proporciones de pantalla. Dos valores interesantes son contain y cover.

Script para monitorizar y reiniciar automáticamente el servidor de base de datos mysql en caso de fallo

Imago voragine.net
• Por
Hay programas que permiten monitorizar todo un sistema y reiniciar los servicios que se paran o fallan de manera inesperada, todo esto automáticamente. Es el caso de monit, un programa que se ejecuta en segundo plano (daemon) eficaz y que no consume muchos recursos. Sin embargo hay veces que es más rápido y ligero hacer un pequeño script de bash y ejecutarlo periódicamente con cron. Esto es exactamente lo que he hecho para monitorizar el servidor de base de datos de uno de mis servidores web y reiniciarlo en caso de que se pare.

Expresiones regulares de vi y Perl para sustituir comas por puntos en números decimales, y cómo aplicarlo en PHP

Imago voragine.net
• Por

Los lenguajes de programación fueron inventados por gente que hablaba y escribía en inglés, así que están pensados para funcionar con las convenciones lingüisticas y matemáticas inglesas. Cuando cualquier lenguaje de programación tiene que relacionarse con bases de datos en idiomas diferentes siempre hay problemas.

Uno típico se da cuando se utiliza una base de datos en español que contiene números racionales en su expresión decimal. Para notar los decimales en inglés se utiliza el punto (0.45) y en español la coma (0,45). Así que antes de operar con estos números hay que convertir esas comas en puntos para que el lenguaje de programación entienda los números como decimales.

Este problema lo encontramos por ejemplo cuando queremos insertar datos que tenemos en un CSV a una base de datos SQL, utilizando PHP. Pondré como ejemplo el CSV de un proyecto en el que estoy trabajando, una herramienta para medir las emisiones de dióxido de carbono en los procesos constructivos.

Podemos transformar los números fácilmente usando expresiones regulares de vi en el editor vim, o expresiones regulares Perl en PHP mediante la función preg_replace.

Función PHP para eliminar parámetros de una URL

Imago voragine.net
[actualizado el ] • Por Enlace permanente

En el hilo de comentarios de la entrada PHP Function: Remove a Query String Key, Value del blog de David Walsh hay un buen puñado de funciones que permiten eliminar parámetros de una URL. Una de ellas me parece una solución más sencilla que la propone el propio David.

La he modificado mínimamente para que ofrezca la posibilidad de eliminar más de un parámetro:

// Elimina los parámetros suministrador mediante la array $keys de la URL $url
function remove_url_query_args($url,$keys=array()) {
        $url_parts = parse_url($url);
        if(empty($url_parts['query'])) return $url;
                
        parse_str($url_parts['query'], $result_array);
        foreach ( $keys as $key ) { unset($result_array[$key]); }
        $url_parts['query'] = http_build_query($result_array);
        $url = (isset($url_parts["scheme"])?$url_parts["scheme"]."://":"").
                (isset($url_parts["user"])?$url_parts["user"].":":"").
                (isset($url_parts["pass"])?$url_parts["pass"]."@":"").
                (isset($url_parts["host"])?$url_parts["host"]:"").
                (isset($url_parts["port"])?":".$url_parts["port"]:"").
                (isset($url_parts["path"])?$url_parts["path"]:"").
                (isset($url_parts["query"])?"?".$url_parts["query"]:"").
                (isset($url_parts["fragment"])?"#".$url_parts["fragment"]:"");
        return $url;
}

Por ejemplo:

$keys = array("param1","param3");
$url = "http://example.org/?param1=value1&param2=value2&param3=value3";
echo remove_url_query_args($url,$keys);
// output: http://example.org/?param2=value2

Función JavaScript para detectar si una página web está siendo visitada desde un dispositivo móvil

Imago voragine.net
[actualizado el ] • Por Enlace permanente

Buceando en el código del theme Hero de WordPress, desarrollado por ThemeTrust he encontrado una función JavaScript muy sencillita para detectar si una página web está siendo visitada desde un dispositivo móvil.

No es completa, pero sí cubre los principales dispositivos móviles:

function isMobile(){
    return (
        (navigator.userAgent.match(/Android/i)) ||
        (navigator.userAgent.match(/webOS/i)) ||
        (navigator.userAgent.match(/iPhone/i)) ||
        (navigator.userAgent.match(/iPod/i)) ||
        (navigator.userAgent.match(/iPad/i)) ||
        (navigator.userAgent.match(/BlackBerry/i))
    );
}

Cómo hacer una petición POST a un servidor usando cURL en un script PHP

Imago voragine.net
[actualizado el ] • Por Enlace permanente

cURL es muy útil para comunicarse con muchas APIs o más en general para automatizar peticiones y enviar datos entre servidores en internet. Cuando se usa cURL los datos se pueden enviar usando varios protocolos.

El siguiente snippet hace una petición a un servidor remoto enviando datos mediante el protocolo HTTP POST:

<?php
// abrimos la sesión cURL
$ch = curl_init();

// definimos la URL a la que hacemos la petición
curl_setopt($ch, CURLOPT_URL,"http://www.example.com/test.php");
// indicamos el tipo de petición: POST
curl_setopt($ch, CURLOPT_POST, TRUE);
// definimos cada uno de los parámetros
curl_setopt($ch, CURLOPT_POSTFIELDS, "postvar1=value1&postvar2=value2&postvar3=value3");

// recibimos la respuesta y la guardamos en una variable
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$remote_server_output = curl_exec ($ch);

// cerramos la sesión cURL
curl_close ($ch);

// hacemos lo que queramos con los datos recibidos
// por ejemplo, los mostramos
print_r($remote_server_output);
?>

Antes de poder usar cURL hay que asegurarse que está instalado ;) Si no lo está, se instala y se reinicia el servidor web:

apt-get install php-curl
service apache2 restart

Cómo hacer copias de seguridad de bases de datos con PHP y mysqldump

Imago voragine.net
• Por
Los siguientes scripts de PHP llaman al programa mysqldump para hacer una copia de seguridad de una base de datos. La primera versión, básica, genera un archivo comprimido con gzip que aloja en la ubicación desde donde se ejecute el script. La segunda versión incorpora una salida para cada comando utilizado, para saber en el caso de que haya fallo dónde se ha producido; además utiliza bzip2 como compresor, más eficiente. Realizar copias de bases de datos mediante un script de PHP puede ser útil si no tenemos acceso SSH al servidor.

Función PHP para limpiar una cadena de texto y usarla como URL

La siguiente función, cuyo autor es Chyrp, prepara un string para ser usado como parte de una URL. Por ejemplo, permite crear el slug de un artículo a partir de su título.

/*
 * Parameters:
 *     $string - The string to sanitize.
 *     $force_lowercase - Force the string to lowercase?
 *     $anal - If set to *true*, will remove all non-alphanumeric characters.
 */
function string_sanitize($string, $force_lowercase = true, $anal = false) {
    $strip = array("~", "`", "!", "@", "#", "$", "%", "^", "&", "*", "(", ")", "_", "=", "+", "[", "{", "]",
                   "}", "\\", "|", ";", ":", "\"", "'", "‘", "’", "“", "”", "–", "—",
                   "—", "–", ",", "<", ".", ">", "/", "?");
    $clean = trim(str_replace($strip, "", strip_tags($string)));
    $clean = preg_replace('/\s+/', "-", $clean);
    $clean = ($anal) ? preg_replace("/[^a-zA-Z0-9]/", "", $clean) : $clean ;
    return ($force_lowercase) ?
        (function_exists('mb_strtolower')) ?
            mb_strtolower($clean, 'UTF-8') :
            strtolower($clean) :
        $clean;
}

Simplitt, generador de sitios estáticos a partir de una hoja de cálculo

Imago voragine.net
• Por
Hace unos días Pablo y yo liberamos la versión 2.0 de simplitt. Simplitt permite construir webs sencillas y ligeras. En las versiones anteriores experimentamos con la idea de trabajar sin base de datos SQL para poder prescindir del servidor de base de datos, y así poder funcionar con un servidor sin muchos recursos de hardware. Como alternativa ligera a SQL, decidimos almacenar los datos en archivos de texto plano, para poder seguir disfrutando de la potencia de generar dinámicamente las webs. En esta nueva versión, hemos convertido simplitt en un generador de sitios estáticos que utiliza un archivo CSV como base de datos.