Fix Lighthouse SEO metadata issues
This commit is contained in:
@@ -1,6 +1,5 @@
|
|||||||
import type { Metadata } from "next";
|
import type { Metadata } from "next";
|
||||||
import { Geist, Geist_Mono } from "next/font/google";
|
import { Geist, Geist_Mono } from "next/font/google";
|
||||||
import { headers } from "next/headers";
|
|
||||||
import Image from "next/image";
|
import Image from "next/image";
|
||||||
import Link from "next/link";
|
import Link from "next/link";
|
||||||
import { Suspense } from "react";
|
import { Suspense } from "react";
|
||||||
@@ -19,7 +18,7 @@ const geistMono = Geist_Mono({
|
|||||||
});
|
});
|
||||||
|
|
||||||
export const metadata: Metadata = {
|
export const metadata: Metadata = {
|
||||||
metadataBase: new URL("https://opplens.com"),
|
metadataBase: new URL("https://opplenz.com"),
|
||||||
title: "Opp lens - AI-Powered Tender Management",
|
title: "Opp lens - AI-Powered Tender Management",
|
||||||
description:
|
description:
|
||||||
"Democratizing Tender Access for SMEs with AI-Powered Tender Management.",
|
"Democratizing Tender Access for SMEs with AI-Powered Tender Management.",
|
||||||
@@ -81,13 +80,11 @@ function ContactInfo({
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
export default async function RootLayout({
|
export default function RootLayout({
|
||||||
children,
|
children,
|
||||||
}: Readonly<{
|
}: Readonly<{
|
||||||
children: React.ReactNode;
|
children: React.ReactNode;
|
||||||
}>) {
|
}>) {
|
||||||
const domain = (await headers()).get("host")?.replace("www.", "");
|
|
||||||
|
|
||||||
const contactInfo = [
|
const contactInfo = [
|
||||||
{
|
{
|
||||||
icon: "/Message.svg",
|
icon: "/Message.svg",
|
||||||
@@ -128,7 +125,7 @@ export default async function RootLayout({
|
|||||||
</Link>
|
</Link>
|
||||||
</section>
|
</section>
|
||||||
<Suspense>
|
<Suspense>
|
||||||
<NavigationBar host={domain ?? "opplens.com"} />
|
<NavigationBar />
|
||||||
</Suspense>
|
</Suspense>
|
||||||
</header>
|
</header>
|
||||||
|
|
||||||
|
|||||||
+2
-2
@@ -11,7 +11,7 @@ export const metadata: Metadata = {
|
|||||||
openGraph: {
|
openGraph: {
|
||||||
title: "Opp lens - AI-Powered Tender Management",
|
title: "Opp lens - AI-Powered Tender Management",
|
||||||
description: "Win more tenders automatically with our AI-powered platform",
|
description: "Win more tenders automatically with our AI-powered platform",
|
||||||
url: "https://opplens.com/",
|
url: "https://opplenz.com/",
|
||||||
type: "website",
|
type: "website",
|
||||||
locale: "en_US",
|
locale: "en_US",
|
||||||
siteName: "Opp lens",
|
siteName: "Opp lens",
|
||||||
@@ -23,7 +23,7 @@ export const metadata: Metadata = {
|
|||||||
images: ["/images/opp-lens-mobile.jpg"],
|
images: ["/images/opp-lens-mobile.jpg"],
|
||||||
},
|
},
|
||||||
alternates: {
|
alternates: {
|
||||||
canonical: "https://opplens.com/",
|
canonical: "https://opplenz.com/",
|
||||||
},
|
},
|
||||||
robots: {
|
robots: {
|
||||||
index: true,
|
index: true,
|
||||||
|
|||||||
@@ -18,8 +18,14 @@ const geistMono = Geist_Mono({
|
|||||||
});
|
});
|
||||||
|
|
||||||
export const metadata: Metadata = {
|
export const metadata: Metadata = {
|
||||||
title: "Create Next App",
|
metadataBase: new URL("https://opplenz.com"),
|
||||||
description: "Generated by create next app",
|
title: "Page Not Found | Opp lens",
|
||||||
|
description:
|
||||||
|
"Opp lens helps SMEs find relevant tenders, automate document handling, and get real-time alerts for new opportunities.",
|
||||||
|
robots: {
|
||||||
|
index: false,
|
||||||
|
follow: true,
|
||||||
|
},
|
||||||
icons: {
|
icons: {
|
||||||
icon: "/fav-icon.svg",
|
icon: "/fav-icon.svg",
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
import Link from "next/link";
|
import Link from "next/link";
|
||||||
import { usePathname } from "next/navigation";
|
import { usePathname } from "next/navigation";
|
||||||
|
|
||||||
const NavigationBar = ({ host }: { host: string }) => {
|
const NavigationBar = ({ host = "opplenz.com" }: { host?: string }) => {
|
||||||
const pathname = usePathname();
|
const pathname = usePathname();
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
|||||||
@@ -0,0 +1,40 @@
|
|||||||
|
import "./globals.css";
|
||||||
|
|
||||||
|
const description =
|
||||||
|
"Opp lens helps SMEs find relevant tenders, automate document handling, and get real-time alerts for new opportunities.";
|
||||||
|
|
||||||
|
export default function GlobalNotFound() {
|
||||||
|
return (
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<title>Page Not Found | Opp lens</title>
|
||||||
|
<meta
|
||||||
|
name="description"
|
||||||
|
content={description}
|
||||||
|
/>
|
||||||
|
<meta
|
||||||
|
name="robots"
|
||||||
|
content="noindex, follow"
|
||||||
|
/>
|
||||||
|
<link
|
||||||
|
rel="icon"
|
||||||
|
href="/fav-icon.svg"
|
||||||
|
/>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<main className="min-h-screen px-6 py-16 flex flex-col items-center justify-center text-center">
|
||||||
|
<h1 className="text-3xl font-bold text-[#013280]">Page not found</h1>
|
||||||
|
<p className="mt-4 max-w-xl text-[#777]">
|
||||||
|
Sorry, the page you are looking for does not exist or has been
|
||||||
|
removed.
|
||||||
|
</p>
|
||||||
|
<a
|
||||||
|
href="/"
|
||||||
|
className="mt-8 rounded-full bg-(--primary) px-8 py-4 text-white">
|
||||||
|
Home
|
||||||
|
</a>
|
||||||
|
</main>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
import type { MetadataRoute } from "next";
|
||||||
|
|
||||||
|
const siteUrl = "https://opplenz.com";
|
||||||
|
|
||||||
|
export default function robots(): MetadataRoute.Robots {
|
||||||
|
return {
|
||||||
|
rules: {
|
||||||
|
userAgent: "*",
|
||||||
|
allow: "/",
|
||||||
|
},
|
||||||
|
sitemap: `${siteUrl}/sitemap.xml`,
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
import type { MetadataRoute } from "next";
|
||||||
|
|
||||||
|
const siteUrl = "https://opplenz.com";
|
||||||
|
|
||||||
|
export default function sitemap(): MetadataRoute.Sitemap {
|
||||||
|
return [
|
||||||
|
{
|
||||||
|
url: siteUrl,
|
||||||
|
lastModified: new Date(),
|
||||||
|
changeFrequency: "weekly",
|
||||||
|
priority: 1,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
url: `${siteUrl}/contact-us`,
|
||||||
|
lastModified: new Date(),
|
||||||
|
changeFrequency: "monthly",
|
||||||
|
priority: 0.7,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
url: `${siteUrl}/marketing`,
|
||||||
|
lastModified: new Date(),
|
||||||
|
changeFrequency: "monthly",
|
||||||
|
priority: 0.6,
|
||||||
|
},
|
||||||
|
];
|
||||||
|
}
|
||||||
@@ -4,6 +4,8 @@
|
|||||||
<head>
|
<head>
|
||||||
<meta charset="utf-8">
|
<meta charset="utf-8">
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1">
|
<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1">
|
||||||
|
<meta name="description" content="Contact Opp lens to learn how AI-powered tender management helps SMEs find relevant tenders and win more opportunities.">
|
||||||
|
<link rel="canonical" href="https://opplenz.com/contact-us">
|
||||||
<link rel="icon" type="image/x-icon" href="assets/image/favicon.ico">
|
<link rel="icon" type="image/x-icon" href="assets/image/favicon.ico">
|
||||||
<title>Opplens</title>
|
<title>Opplens</title>
|
||||||
<link rel="stylesheet" href="assets/css/style.css">
|
<link rel="stylesheet" href="assets/css/style.css">
|
||||||
|
|||||||
@@ -4,6 +4,8 @@
|
|||||||
<head>
|
<head>
|
||||||
<meta charset="utf-8">
|
<meta charset="utf-8">
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1">
|
<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1">
|
||||||
|
<meta name="description" content="Opp lens helps SMEs compete for public and private tenders with AI-powered discovery, preparation support, and opportunity alerts.">
|
||||||
|
<link rel="canonical" href="https://opplenz.com/email-marketing">
|
||||||
<link rel="icon" type="image/x-icon" href="assets/image/favicon.ico">
|
<link rel="icon" type="image/x-icon" href="assets/image/favicon.ico">
|
||||||
<title>Opplens</title>
|
<title>Opplens</title>
|
||||||
<link rel="stylesheet" href="assets/css/style.css">
|
<link rel="stylesheet" href="assets/css/style.css">
|
||||||
|
|||||||
@@ -4,6 +4,8 @@
|
|||||||
<head>
|
<head>
|
||||||
<meta charset="utf-8">
|
<meta charset="utf-8">
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1">
|
<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1">
|
||||||
|
<meta name="description" content="Automated tender management platform for SMEs. Find tailored tenders, automate document handling, and get real-time alerts.">
|
||||||
|
<link rel="canonical" href="https://opplenz.com/">
|
||||||
<link rel="icon" type="image/x-icon" href="assets/image/favicon.ico">
|
<link rel="icon" type="image/x-icon" href="assets/image/favicon.ico">
|
||||||
<title>Opplens</title>
|
<title>Opplens</title>
|
||||||
<link rel="stylesheet" href="assets/css/style.css">
|
<link rel="stylesheet" href="assets/css/style.css">
|
||||||
|
|||||||
+4
-1
@@ -1,7 +1,10 @@
|
|||||||
import type { NextConfig } from "next";
|
import type { NextConfig } from "next";
|
||||||
|
|
||||||
const nextConfig: NextConfig = {
|
const nextConfig: NextConfig = {
|
||||||
/* config options here */
|
experimental: {
|
||||||
|
globalNotFound: true,
|
||||||
|
},
|
||||||
|
htmlLimitedBots: /.*/,
|
||||||
};
|
};
|
||||||
|
|
||||||
export default nextConfig;
|
export default nextConfig;
|
||||||
|
|||||||
Reference in New Issue
Block a user