enzostvs's picture
enzostvs HF Staff
improve SEO
8bce833
raw
history blame
3.71 kB
"use client";
import { useEffect, useState } from "react";
import IframeWarningModal from "./modal";
export default function IframeDetector() {
const [showWarning, setShowWarning] = useState(false);
useEffect(() => {
// Helper function to check if a hostname is from allowed domains
const isAllowedDomain = (hostname: string) => {
const host = hostname.toLowerCase();
return (
host.endsWith(".huggingface.co") ||
host.endsWith(".hf.co") ||
host === "huggingface.co" ||
host === "hf.co" ||
host === "enzostvs-deepsite.hf.space" ||
host === "deepsite.hf.co"
);
};
// Check if the current window is in an iframe
const isInIframe = () => {
try {
return window.self !== window.top;
} catch {
// If we can't access window.top due to cross-origin restrictions,
// we're likely in an iframe
return true;
}
};
// Additional check: compare window location with parent location
const isEmbedded = () => {
try {
return window.location !== window.parent.location;
} catch {
// Cross-origin iframe
return true;
}
};
// SEO: Add canonical URL meta tag when in iframe
const addCanonicalUrl = () => {
// Remove existing canonical link if present
const existingCanonical = document.querySelector('link[rel="canonical"]');
if (existingCanonical) {
existingCanonical.remove();
}
// Add canonical URL pointing to the standalone version
const canonical = document.createElement("link");
canonical.rel = "canonical";
canonical.href = window.location.href;
document.head.appendChild(canonical);
// Add meta tag to indicate this page should not be indexed when in iframe from unauthorized domains
if (isInIframe() || isEmbedded()) {
try {
const parentHostname = document.referrer
? new URL(document.referrer).hostname
: null;
if (parentHostname && !isAllowedDomain(parentHostname)) {
// Add noindex meta tag when embedded in unauthorized domains
const noIndexMeta = document.createElement("meta");
noIndexMeta.name = "robots";
noIndexMeta.content = "noindex, nofollow";
document.head.appendChild(noIndexMeta);
}
} catch (error) {
// Silently handle cross-origin errors
console.debug(
"SEO: Could not determine parent domain for iframe indexing rules"
);
}
}
};
// Check if we're in an iframe from a non-allowed domain
const shouldShowWarning = () => {
if (!isInIframe() && !isEmbedded()) {
return false; // Not in an iframe
}
try {
// Try to get the parent's hostname
const parentHostname = window.parent.location.hostname;
return !isAllowedDomain(parentHostname);
} catch {
// Cross-origin iframe - try to get referrer instead
try {
if (document.referrer) {
const referrerUrl = new URL(document.referrer);
return !isAllowedDomain(referrerUrl.hostname);
}
} catch {
// If we can't determine the parent domain, assume it's not allowed
}
return true;
}
};
// Always add canonical URL for SEO, regardless of iframe status
addCanonicalUrl();
if (shouldShowWarning()) {
// Show warning modal instead of redirecting immediately
setShowWarning(true);
}
}, []);
return (
<IframeWarningModal isOpen={showWarning} onOpenChange={setShowWarning} />
);
}