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';
export default defineConfig({
site: 'https://www.mnqcatering.com',
site: 'https://www.mnqeventos.es',
output: 'server',
adapter: node({
mode: 'standalone',
+1 -1
View File
@@ -1,6 +1,6 @@
MNQ Catering y Evento
- Canonical domain: https://www.mnqcatering.com
- Canonical domain: https://www.mnqeventos.es
- Business type: Premium catering service
- Address: Calle Camino Vivero, 6, 29014, Málaga, España
- Area served: Málaga (city) and Provincia de Málaga
+1 -1
View File
@@ -1,4 +1,4 @@
User-agent: *
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>
<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="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>
</div>
</div>
+23 -5
View File
@@ -30,18 +30,36 @@ const {
structuredData,
} = 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 ogImageUrl = new URL(ogImage, site).toString();
const baseStructuredData = {
'@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',
url: site.origin,
description:
'Servicio de catering para bodas, eventos corporativos y reuniones familiares con enfoque premium.',
telephone: '+34 678 17 15 13',
serviceType: ['Bodas', 'Eventos corporativos', 'Reuniones familiares'],
telephone: '+34678171513',
// 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.
address: {
'@type': 'PostalAddress',
@@ -77,7 +95,7 @@ const structuredDataScripts = [
? [structuredData]
: []) 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 umamiWebsiteId = import.meta.env.PUBLIC_UMAMI_WEBSITE_ID;
const normalizedUmamiUrl = rawUmamiUrl
+7 -6
View File
@@ -1,13 +1,14 @@
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
* redirect at the DNS/hosting level). This middleware enforces the canonical
* host at the application layer for any host that isn't exactly
* www.mnqcatering.com (covers mnqeventos.es, www.mnqeventos.es, and the bare
* mnqcatering.com apex).
* SEO: enforce the canonical host at the application layer. www.mnqeventos.es
* is the real, registered, live production domain. mnqcatering.com was an
* intended rename that was never actually registered (confirmed via WHOIS —
* no match) — do NOT set CANONICAL_HOST back to it unless that domain is
* 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
* 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>
<div style="display:flex;align-items:center;gap:var(--space-4);">
<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>
+1 -1
View File
@@ -21,7 +21,7 @@ import MainLayout from '../layouts/MainLayout.astro';
<p>
<strong>MNQ Catering y Evento</strong><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>
<h2>2. Datos que tratamos</h2>