Skip to main content

Dynamic SEO, Schema JSON-LD & 301 Redirects

The HiTech SEO & Canonicalization Infrastructure safeguards domain authority, guarantees search engine crawlability, and eliminates duplicate content penalties across bilingual index pages. It combines strict apex domain canonicalization, a comprehensive table of permanent 301 redirects, automated multilingual hreflang alternate links, and rich JSON-LD structured data generators.


1. Apex Domain Canonicalization (HTTP 301)​

To consolidate backlink equity and prevent Google search split-indexing, next.config.ts enforces a strict 301 redirect for all www requests:

// next.config.ts
async redirects() {
return [
{
source: "/:path*",
has: [
{
type: "host",
value: "www.hitechinsurance.ai",
},
],
destination: "https://hitechinsurance.ai/:path*",
permanent: true,
},
// ...
];
}

2. Comprehensive Legacy & Alias Redirections Table​

During platform modernization, several URL paths and short insurance aliases were upgraded to descriptive, SEO-optimized endpoints. All legacy routes return an HTTP 301 permanent redirect:

Legacy Source URLCanonical Destination URLPermanent?Purpose / Business Rationale
/e/:slug/en/e/:slugfalse (307)Short URL resolver for physical QR campaign flyers.
/location/locationstrue (301)Pluralization alignment for agency physical locations.
/career/careerstrue (301)Pluralization alignment for agency recruitment.
/refer/refer-and-earntrue (301)High-intent CTA slug alignment for customer referrals.
/login/sign-intrue (301)Canonical auth route matching Auth.js standard.
/claims/file-a-claimtrue (301)Action-oriented slug for policyholders filing claims.
/about/insurance/personal-informationtrue (301)Legal compliance with CCPA personal info intake.
/about/privacy-policy/privacy-noticetrue (301)Statutory privacy notice consolidation.
/privacy-policy/privacy-noticetrue (301)Apex privacy alias consolidation.
/smsPolicy/sms-policytrue (301)Kebab-case normalization.
/about/privacy-appeal/privacy-appealtrue (301)Statutory consumer appeal pathway.
/insurance/auto/insurance/auto-insurancetrue (301)Keyword enrichment for auto insurance queries.
/insurance/truck/insurance/truck-insurancetrue (301)High-intent commercial trucking SEO slug.
/insurance/homeowners/insurance/homeowners-insurancetrue (301)Keyword enrichment for property coverage.
/insurance/business/insurance/business-insurancetrue (301)Keyword enrichment for commercial BOP.
/insurance/general-liability/insurance/general-liability-insurancetrue (301)Keyword enrichment for GL policies.
/insurance/workers-compensation/insurance/workers-compensation-insurancetrue (301)Keyword enrichment for WC coverage.
/insurance/sr-22/insurance/sr22-insurancetrue (301)Normalized alphanumeric slug for SR-22 certificates.
/insurance/mexico/insurance/mexico-insurancetrue (301)Cross-border auto tourist policy alias.
/insurance/construction/insurance/construction-insurancetrue (301)Contractor and artisan liability alias.
/insurance/retail-wholesale/insurance/retail-and-wholesale-insurancetrue (301)Retail & wholesale merchandise coverage.
/insurance/professional-service/insurance/professional-services-insurancetrue (301)Errors & Omissions (E&O) alias.

3. Metadata Service (MetaDataService.ts)​

Metadata generation is centralized in src/services/meta-data-service.ts using React's cache() utility for per-request memoization:

export class MetaDataService {
static async generateMetadata(
path: string,
locale?: string,
replacements?: Record<string, string>
): Promise<Metadata> {
const currentLocale = locale || (await getLocale()) || "en";
const meta = this.getRouteMeta(path, currentLocale);

// Apply token replacements (e.g. {title}, {location})
let title = meta.title;
let description = meta.description;
if (replacements) {
for (const [key, value] of Object.entries(replacements)) {
title = title.replace(`{${key}}`, value);
description = description.replace(`{${key}}`, value);
}
}

const baseUrl = env.NEXT_PUBLIC_APP_URL.replace(/\/+$/, "");
const normalizedPath = path.replace(/^\/(en|es)(\/|$)/, "/");
const pathSuffix = normalizedPath === "/" ? "" : normalizedPath;

// Fully qualified canonical and hreflang definitions
const canonicalUrl = `${baseUrl}/${currentLocale}${pathSuffix}`;
const languages = {
en: `${baseUrl}/en${pathSuffix}`,
es: `${baseUrl}/es${pathSuffix}`,
"x-default": `${baseUrl}/en${pathSuffix}`,
};

return {
title,
description,
keywords: meta.keywords,
openGraph: {
title,
description,
url: canonicalUrl,
images: [{ url: DEFAULT_OG_IMAGE, width: 1200, height: 630 }],
type: (meta.ogType as "website" | "article") || "website",
siteName: "HiTech Insurance",
},
twitter: {
card: "summary_large_image",
title,
description,
images: [DEFAULT_OG_IMAGE],
},
alternates: {
canonical: canonicalUrl,
languages,
},
};
}
}

Self-Referential Canonical & Hreflang Alignment​

By emitting en, es, and x-default (pointing to the English primary version), Google recognizes both language pages as mutual alternates rather than penalized duplicates:

<!-- Injected in HTML Head -->
<link rel="canonical" href="https://hitechinsurance.ai/en/insurance/auto-insurance" />
<link rel="alternate" hreflang="en" href="https://hitechinsurance.ai/en/insurance/auto-insurance" />
<link rel="alternate" hreflang="es" href="https://hitechinsurance.ai/es/insurance/auto-insurance" />
<link rel="alternate" hreflang="x-default" href="https://hitechinsurance.ai/en/insurance/auto-insurance" />

4. Structured JSON-LD Schemas (schema-generators.ts)​

The application generates Google-compliant JSON-LD data graphs injected via <JsonLd /> components:

1. Organization Schema​

Declares HiTech Insurance as an authorized brokerage entity, citing contact lines (1-800-XXX-XXXX), physical headquarters in Texas, and official logo graphics.

2. BreadcrumbList Schema​

Enables breadcrumb trails in SERP listings:

Home > Insurance > Commercial Trucking Insurance

3. Article Schema​

Injects author attribution, publisher information, datePublished, dateModified, and featured banner graphics for editorial blog guides.

4. FAQPage Schema​

Formats question/answer lists for expandable rich accordion display within Google search results.


5. Security & Cloaking: Search Engine Bot Boundaries​

To protect sensitive portals from being spidered:

  • /admin/*, /dashboard/*, and /embed/widget explicitly return robots: { index: false, follow: false }.
  • Unauthorized access attempts to /admin invoke Next.js notFound(), returning an HTTP 404 to discourage credential stuffers and automated crawlers.