fix(seo): correct canonical domain to www.mnqeventos.es

mnqcatering.com was never actually registered (WHOIS: no match, no DNS
records) -- it was an intended rename that never happened. The real,
live, registered production domain is www.mnqeventos.es. Every
canonical/OG/schema/sitemap/robots reference and the host-redirect
middleware pointed at the wrong, non-resolving domain; left as-is, the
middleware would have 301'd every real visitor away to a dead host.

Also fixes two schema.org validity issues found during audit:
- '@type': 'CateringService' is not a real schema.org type -- corrected
  to 'CateringBusiness' (LocalBusiness/FoodEstablishment subtype)
- 'serviceType' is a Service property, not valid on LocalBusiness --
  restructured as makesOffer -> Offer -> itemOffered Service entities
- telephone normalized to E.164 in the schema block
This commit is contained in:
2026-09-15 10:07:24 +02:00
parent 0e242a6116
commit a6692b7540
8 changed files with 36 additions and 17 deletions
+1 -1
View File
@@ -3,7 +3,7 @@ import node from '@astrojs/node';
import sitemap from '@astrojs/sitemap'; import sitemap from '@astrojs/sitemap';
export default defineConfig({ export default defineConfig({
site: 'https://www.mnqcatering.com', site: 'https://www.mnqeventos.es',
output: 'server', output: 'server',
adapter: node({ adapter: node({
mode: 'standalone', mode: 'standalone',
+1 -1
View File
@@ -1,6 +1,6 @@
MNQ Catering y Evento MNQ Catering y Evento
- Canonical domain: https://www.mnqcatering.com - Canonical domain: https://www.mnqeventos.es
- Business type: Premium catering service - Business type: Premium catering service
- Address: Calle Camino Vivero, 6, 29014, Málaga, España - Address: Calle Camino Vivero, 6, 29014, Málaga, España
- Area served: Málaga (city) and Provincia de Málaga - Area served: Málaga (city) and Provincia de Málaga
+1 -1
View File
@@ -1,4 +1,4 @@
User-agent: * User-agent: *
Allow: / Allow: /
Sitemap: https://www.mnqcatering.com/sitemap-index.xml Sitemap: https://www.mnqeventos.es/sitemap-index.xml
+1 -1
View File
@@ -19,7 +19,7 @@ const whatsappAriaLabel = 'Contactar con MNQ por WhatsApp';
<p>© 2025 MNQ Catering y Evento. Excelencia culinaria para los momentos más importantes de su vida.</p> <p>© 2025 MNQ Catering y Evento. Excelencia culinaria para los momentos más importantes de su vida.</p>
<div style="display:flex;flex-direction:column;gap:0.35rem;margin-top:var(--space-4);"> <div style="display:flex;flex-direction:column;gap:0.35rem;margin-top:var(--space-4);">
<a href="tel:+34678171513" class="footer-link" style="width:fit-content;">+34 678 17 15 13</a> <a href="tel:+34678171513" class="footer-link" style="width:fit-content;">+34 678 17 15 13</a>
<a href="https://www.mnqcatering.com" class="footer-link" style="width:fit-content;">www.mnqcatering.com</a> <a href="https://www.mnqeventos.es" class="footer-link" style="width:fit-content;">www.mnqeventos.es</a>
<p class="text-body-sm" style="width:fit-content;">Calle Camino Vivero, 6, 29014, Málaga</p> <p class="text-body-sm" style="width:fit-content;">Calle Camino Vivero, 6, 29014, Málaga</p>
</div> </div>
</div> </div>
+23 -5
View File
@@ -30,18 +30,36 @@ const {
structuredData, structuredData,
} = Astro.props; } = Astro.props;
const site = Astro.site ?? new URL('https://www.mnqcatering.com'); const site = Astro.site ?? new URL('https://www.mnqeventos.es');
const canonicalUrl = new URL(canonical ?? Astro.url.pathname, site).toString(); const canonicalUrl = new URL(canonical ?? Astro.url.pathname, site).toString();
const ogImageUrl = new URL(ogImage, site).toString(); const ogImageUrl = new URL(ogImage, site).toString();
const baseStructuredData = { const baseStructuredData = {
'@context': 'https://schema.org', '@context': 'https://schema.org',
'@type': 'CateringService', // schema.org has no "CateringService" type. CateringBusiness (a
// LocalBusiness/FoodEstablishment subtype) is the correct type for a
// catering company with a physical address.
'@type': 'CateringBusiness',
name: 'MNQ Catering y Evento', name: 'MNQ Catering y Evento',
url: site.origin, url: site.origin,
description: description:
'Servicio de catering para bodas, eventos corporativos y reuniones familiares con enfoque premium.', 'Servicio de catering para bodas, eventos corporativos y reuniones familiares con enfoque premium.',
telephone: '+34 678 17 15 13', telephone: '+34678171513',
serviceType: ['Bodas', 'Eventos corporativos', 'Reuniones familiares'], // makesOffer/Service is the correct structure for what a business offers;
// serviceType is a property of Service, not of LocalBusiness.
makesOffer: [
{
'@type': 'Offer',
itemOffered: { '@type': 'Service', name: 'Catering para bodas' },
},
{
'@type': 'Offer',
itemOffered: { '@type': 'Service', name: 'Catering para eventos corporativos' },
},
{
'@type': 'Offer',
itemOffered: { '@type': 'Service', name: 'Catering para reuniones familiares' },
},
],
// Verified business address (owner-confirmed). Geo coordinates not confirmed — left out. // Verified business address (owner-confirmed). Geo coordinates not confirmed — left out.
address: { address: {
'@type': 'PostalAddress', '@type': 'PostalAddress',
@@ -77,7 +95,7 @@ const structuredDataScripts = [
? [structuredData] ? [structuredData]
: []) as Array<Record<string, unknown>>), : []) as Array<Record<string, unknown>>),
]; ];
const umamiHost = Astro.site ? Astro.site.origin : 'https://www.mnqcatering.com'; const umamiHost = Astro.site ? Astro.site.origin : 'https://www.mnqeventos.es';
const rawUmamiUrl = Astro.url ? import.meta.env.PUBLIC_UMAMI_URL : undefined; const rawUmamiUrl = Astro.url ? import.meta.env.PUBLIC_UMAMI_URL : undefined;
const umamiWebsiteId = import.meta.env.PUBLIC_UMAMI_WEBSITE_ID; const umamiWebsiteId = import.meta.env.PUBLIC_UMAMI_WEBSITE_ID;
const normalizedUmamiUrl = rawUmamiUrl const normalizedUmamiUrl = rawUmamiUrl
+7 -6
View File
@@ -1,13 +1,14 @@
import { defineMiddleware } from 'astro:middleware'; import { defineMiddleware } from 'astro:middleware';
const CANONICAL_HOST = 'www.mnqcatering.com'; const CANONICAL_HOST = 'www.mnqeventos.es';
/** /**
* SEO: this site is undesirably mirrored at mnqeventos.es (same content, no * SEO: enforce the canonical host at the application layer. www.mnqeventos.es
* redirect at the DNS/hosting level). This middleware enforces the canonical * is the real, registered, live production domain. mnqcatering.com was an
* host at the application layer for any host that isn't exactly * intended rename that was never actually registered (confirmed via WHOIS —
* www.mnqcatering.com (covers mnqeventos.es, www.mnqeventos.es, and the bare * no match) — do NOT set CANONICAL_HOST back to it unless that domain is
* mnqcatering.com apex). * actually purchased and its DNS points at this server, or this redirect
* will send every visitor to a host that doesn't resolve.
* *
* NOTE: this must also be verified at the reverse-proxy/hosting layer — host * NOTE: this must also be verified at the reverse-proxy/hosting layer — host
* detection here depends on how the Host header (or X-Forwarded-Host, when * detection here depends on how the Host header (or X-Forwarded-Host, when
+1 -1
View File
@@ -105,7 +105,7 @@ const whatsappAriaLabel = 'Contactar con MNQ por WhatsApp';
<span class="label-caps text-primary">Sitio web</span> <span class="label-caps text-primary">Sitio web</span>
<div style="display:flex;align-items:center;gap:var(--space-4);"> <div style="display:flex;align-items:center;gap:var(--space-4);">
<Icon name="language" class="text-primary" /> <Icon name="language" class="text-primary" />
<a class="text-muted contact-link" href="https://www.mnqcatering.com">www.mnqcatering.com</a> <a class="text-muted contact-link" href="https://www.mnqeventos.es">www.mnqeventos.es</a>
</div> </div>
</div> </div>
+1 -1
View File
@@ -21,7 +21,7 @@ import MainLayout from '../layouts/MainLayout.astro';
<p> <p>
<strong>MNQ Catering y Evento</strong><br /> <strong>MNQ Catering y Evento</strong><br />
Teléfono: <a href="tel:+34678171513">+34 678 17 15 13</a><br /> Teléfono: <a href="tel:+34678171513">+34 678 17 15 13</a><br />
Sitio web: <a href="https://www.mnqcatering.com">www.mnqcatering.com</a> Sitio web: <a href="https://www.mnqeventos.es">www.mnqeventos.es</a>
</p> </p>
<h2>2. Datos que tratamos</h2> <h2>2. Datos que tratamos</h2>