From dd23cbd8a1caf00f0b842aff514d2907d545a403 Mon Sep 17 00:00:00 2001 From: Ariel Costas Guerrero <94913521+arielcostas@users.noreply.github.com> Date: Wed, 21 Aug 2024 10:10:38 +0200 Subject: Bring back the blog --- src/content/blog/configurar-php-iis.md | 111 +++++++++++++++++++++++++++++++++ src/content/config.ts | 14 +++++ src/pages/blog.astro | 68 ++++++++++++++++++++ src/pages/blog.xml.js | 19 ++++++ src/pages/blog/[slug].astro | 55 ++++++++++++++++ src/pages/index.astro | 29 ++++++++- src/partials/Header.astro | 1 + 7 files changed, 296 insertions(+), 1 deletion(-) create mode 100644 src/content/blog/configurar-php-iis.md create mode 100644 src/content/config.ts create mode 100644 src/pages/blog.astro create mode 100644 src/pages/blog.xml.js create mode 100644 src/pages/blog/[slug].astro diff --git a/src/content/blog/configurar-php-iis.md b/src/content/blog/configurar-php-iis.md new file mode 100644 index 0000000..9f286ec --- /dev/null +++ b/src/content/blog/configurar-php-iis.md @@ -0,0 +1,111 @@ +--- +title: "Alojar aplicación PHP en servidor IIS" +metaDescription: "Un breve tutorial de cómo alojar una aplicación PHP en un servidor IIS para desarrollo" +publishedAt: 2024-08-21 +--- + +En este tutorial, aprenderás a alojar una aplicación PHP en un servidor IIS. IIS es un servidor web desarrollado por Microsoft que viene instalado con Windows y es usable tanto en Windows Server como en escritorios Windows 10/11 Pro y Enterprise. + +Si no tienes PHP instalado, puedes descargarlo desde [php.net](https://www.php.net/downloads) y seguir las instrucciones de instalación. También debes tener IIS activado como característica de Windows (en escritorio) o como rol de servidor (en Windows Server). + +Para este tutorial, suponemos que estamos usando lo siguiente: + +- Ruta de la aplicación: `C:\users\user\app\public` (usamos `public` al alojar una aplicación Symfony, pero debe ser donde estén los archivos PHP públicos) +- Dominio de la aplicación: `app.internal` (`.internal` está reservado para uso interno) +- PHP instalado en `C:\php` +- IIS habilitado y funcionando (en `localhost:80` deberías ver la página de inicio de IIS) +- [MKCert](https://mkcert.dev) instalado para generar certificados TLS autofirmados + +## Crear un certificado TLS autofirmado + +Para poder acceder a tu servidor de forma segura, necesitas un certificado TLS. Puedes usar un certificado autofirmado para propósitos de desarrollo. Para crear un certificado autofirmado, ejecuta los siguientes comandos en PowerShell: + +```powershell +mkcert -install +mkcert -p12 app.internal +``` + +Esto generará un certificado `app.internal.p12` en el directorio actual. Posteriormente, hay que ir a IIS e importar el certificado a nivel servidor (en Seguridad -> Certificados de servidor -> Importar y seleccionando "todos los archivos" para encontrar el archivo `.p12`). + +## Creación del site + +En la barra izquierda, en Sitios hacemos clic derecho y seleccionamos Agregar sitio. En el cuadro de diálogo, rellenamos los campos de la siguiente manera: + +- Nombre del sitio: `app` (o el nombre que prefieras) +- Ruta de acceso física: `C:\users\user\app\public` +- Enlace: + - Tipo: `https` + - Dirección IP: `Todas las direcciones no asignadas` + - Puerto: `443` + - Nombre del host: `app.internal` + - Requerir indicación del nombre del servidor: `Sí` + - Deshabilitar [...] `No` + - Certificado: `app.internal` +- Iniciar sitio web inmediatamente: `Sí` + +Hacemos clic en Aceptar y el sitio se creará. Pero aún hay que configurar PHP y la reescritura de URL (si el enrutamiento se hace por el propio framework, como en Symfony). + +Antes de eso, hay que pulsar en la parte derecha en "Configuración básica" y cerciorarse de que el grupo de aplicaciones es `DefaultAppPool`. Si no lo es, hay que cambiarlo para que el sitio funcione correctamente. + +## Configuración de PHP + +Dentro del Sitio, ir a "Componentes del servidor -> Asignaciones de controlador -> Agregar asignación de módulo" y rellenar los campos de la siguiente manera: +- Ruta de acceso de solicitudes: `*.php` +- Módulo: `FastCgiModule` +- Ejecutable: `C:\php\php-cgi.exe` +- Nombre: `PHP` (o el nombre que prefieras) + +Hacemos clic en Aceptar y el módulo se añadirá. Ahora, hay que configurar la reescritura de URL. + +## Configuración de la reescritura de URL + +Primero, hay que autorizar variables de servidor. Dentro del Sitio, ir a "Caracterísitcas de HTTP -> Reglas de reescritura" y hacer clic en la barra derecha en "Ver variables de servidor". Añadir las siguientes variables: + +- `HTTP_X_FORWARDED_SCHEMA` +- `HTTP_X_FORWARDED_PROTO` +- `HTTP_X_FORWARDED_HOST` +- `HTTP_X_FORWARDED_FOR` + +Hacer clic en Aceptar y volver a la pantalla de reglas de reescritura. Hacer clic en "Agregar reglas" y seleccionar "Regla de blanco" dentro de "Reglas de entrada". Rellenar los campos de la siguiente manera: + +- Nombre: `Symfony` +- Coincidir dirección URL: + - Dirección URL solicitada: `Coincide con el patrón` + - Usando: `Expresiones regulares` + - Patrón: `^(.*)$` + - Omitir mayúsculas y minúsculas: `Desmarcado` +- Condiciones: + - Agrupación lógica: `Coincide con todas` + - Añadir condición: + - Entrada: `{REQUEST_FILENAME}` + - Comprobar si la cadena de entrada: `No es un archivo` + - Seguir los grupos de captura a través de condiciones: `Desmarcado` +- Variables de servidor: + - Agregar...: + - Nombre: `HTTP_X_FORWARDED_PROTO` + - Valor: `https` + - Remplazar el valor existente: `Marcado` + - Agregar...: + - Nombre: `HTTP_X_FORWARDED_SCHEMA` + - Valor: `https` + - Remplazar el valor existente: `Marcado` + - Agregar...: + - Nombre: `HTTP_X_FORWARDED_HOST` + - Valor: `{HTTP_HOST}` + - Remplazar el valor existente: `Marcado` + - Agregar...: + - Nombre: `HTTP_X_FORWARDED_FOR` + - Valor: `{REMOTE_ADDR}` + - Remplazar el valor existente: `Marcado` +- Acción: + - Tipo de acción: `Reescribir` + - Reescribir dirección URL: `/index.php` + - Anexar cadena de consulta: `Marcado` + - Dirección URL reescrita de registro: `Desmarcado` +- Detener procesamiento de reglas: `Desmarcado` + +Hacer clic en Aceptar y la regla se añadirá. Ahora, la aplicación PHP debería estar alojada en el servidor IIS y accesible en `https://app.internal`. + +## Conclusión + +En este tutorial, aprendiste a alojar una aplicación PHP en un servidor IIS. Aprendiste a crear un certificado TLS autofirmado, a configurar PHP y a configurar la reescritura de URL para que la aplicación funcione correctamente. Ahora puedes alojar aplicaciones PHP en un servidor IIS y acceder a ellas de forma segura. \ No newline at end of file diff --git a/src/content/config.ts b/src/content/config.ts new file mode 100644 index 0000000..d0d1d70 --- /dev/null +++ b/src/content/config.ts @@ -0,0 +1,14 @@ +import { defineCollection, z } from 'astro:content'; + +const blogCollection = defineCollection({ + type: 'content', + schema: z.object({ + title: z.string(), + metaDescription: z.string(), + publishedAt: z.date() + }) +}); + +export const collections = { + 'blog': blogCollection +}; diff --git a/src/pages/blog.astro b/src/pages/blog.astro new file mode 100644 index 0000000..4cfcea3 --- /dev/null +++ b/src/pages/blog.astro @@ -0,0 +1,68 @@ +--- +import { getCollection } from "astro:content"; +import Layout from "../layouts/Layout.astro"; +const blogCollection = (await getCollection("blog")).sort((a, b) => { + return b.data.publishedAt.getTime() - a.data.publishedAt.getTime(); +}); +const groupedPosts = blogCollection.reduce( + (acc: Record, post) => { + const year = post.data.publishedAt.getFullYear(); + const month = post.data.publishedAt.getMonth() + 1; + const key = `${year}-${month}`; + if (!acc[key]) { + acc[key] = []; + } + acc[key].push(post); + return acc; + }, + {}, +); +function humaniseDate(date: Date) { + const result = date.toLocaleDateString("es-ES", { + month: "long", + year: "numeric", + }); + return result.charAt(0).toUpperCase() + result.slice(1); +} +const schema = { + "@context": "https://schema.org", + "@type": "Blog", + "headline": "Blog de Ariel Costas", + "description": "En este blog encontrarás artículos sobre desarrollo, tecnología y otras temáticas que pueda querer compartir. Disclaimer de siempre: las opiniones son mías, y no representan a ninguna empresa o institución.", + "publisher": { + "@type": "Person", + "name": "Ariel Costas", + }, + "author": { + "@type": "Person", + "name": "Ariel Costas", + } +}; +--- + + + + +

Blog de Ariel Costas

+ +

+ En este blog encontrarás artículos sobre desarrollo, tecnología y otras + temáticas que pueda querer compartir. Disclaimer de siempre: las + opiniones son mías, y no representan a ninguna empresa o institución. +

+ + { + Object.entries(groupedPosts).map(([key, posts]) => ( +
+

{humaniseDate(new Date(key))}

+ +
+ )) + } +
diff --git a/src/pages/blog.xml.js b/src/pages/blog.xml.js new file mode 100644 index 0000000..b4fbe38 --- /dev/null +++ b/src/pages/blog.xml.js @@ -0,0 +1,19 @@ +import rss from '@astrojs/rss'; +import { getCollection } from 'astro:content'; + + +export async function GET(context) { + const collection = await getCollection('blog'); + + return rss({ + title: "Blog de Ariel Costas", + description: "Artículos del blog de Ariel Costas", + site: context.site, + items: collection.map((post) => ({ + title: post.data.title, + link: `${context.site}blog/${post.slug}`, + description: post.data.metaDescription, + pubDate: post.data.publishedAt + })) + }) +} diff --git a/src/pages/blog/[slug].astro b/src/pages/blog/[slug].astro new file mode 100644 index 0000000..a1a0532 --- /dev/null +++ b/src/pages/blog/[slug].astro @@ -0,0 +1,55 @@ +--- +import type { GetStaticPaths } from "astro"; +import Layout from "../../layouts/Layout.astro"; +import { getCollection } from "astro:content"; +export const getStaticPaths = (async () => { + const entries = await getCollection("blog"); + return entries.map((entry) => ({ + params: { slug: entry.slug }, + props: { entry }, + })); +}) satisfies GetStaticPaths; +const { entry } = Astro.props; +const { Content } = await entry.render(); +const formattedDate = new Date(entry.data.publishedAt).toLocaleDateString( + "es-ES", + { + year: "numeric", + month: "long", + day: "numeric", + weekday: "long", + }, +); +const schema = { + "@context": "https://schema.org", + "@type": "BlogPosting", + headline: entry.data.title, + datePublished: entry.data.publishedAt.toISOString(), + author: { + "@type": "Person", + name: "Ariel Costas Guerrero", + }, + publisher: { + "@type": "Person", + name: "Ariel Costas Guerrero", + logo: { + "@type": "ImageObject", + url: "https://www.costas.dev/favicon.png", + }, + }, +}; +--- + + + + +

{entry.data.title}

+ + Publicado el + + + + +
diff --git a/src/pages/index.astro b/src/pages/index.astro index 0f92a2d..5d1c24d 100644 --- a/src/pages/index.astro +++ b/src/pages/index.astro @@ -2,6 +2,10 @@ import { getCollection } from "astro:content"; import Layout from "../layouts/Layout.astro"; +const blogCollection = (await getCollection("blog")).sort((a, b) => { + return b.data.publishedAt.getTime() - a.data.publishedAt.getTime(); +}); + const schema = { "@context": "http://schema.org", "@type": "WebSite", @@ -29,6 +33,7 @@ const schema = { su conocimiento. Me gusta la programación, el diseño web y la creatividad. Me encanta crear cosas nuevas y aprender de los demás.

+ Más información sobre mí

¿Qué hago?

@@ -36,6 +41,28 @@ const schema = { Cloud en una empresa de tecnología. Me encargo de desarrollar aplicaciones web en PHP y desplegarlas en la nube de forma segura y eficiente.

- Mi portfolio + +

Últimas entradas del blog

+ + Ver todas las entradas + diff --git a/src/partials/Header.astro b/src/partials/Header.astro index e351156..40b8484 100644 --- a/src/partials/Header.astro +++ b/src/partials/Header.astro @@ -36,6 +36,7 @@ import Favicon from "../assets/Favicon.astro"; Inicio Trayectoria Portfolio + Blog Contacto -- cgit v1.3