Implement multi-domain SEO improvements:

- Add metadata to login and login-verify pages to prevent indexing.
- Update robots.txt to disallow additional sensitive paths.
- Enhance sitemap generation to filter by city and include accurate last modified dates.
- Refactor canonical URL generation to support multi-domain architecture, ensuring self-canonicalization for city domains.
- Remove deprecated CanonicalHandler component and streamline canonical URL handling.
- Introduce safe JSON-LD output to prevent XSS vulnerabilities.
- Add payment layout with appropriate metadata to prevent indexing.
- Conduct a comprehensive technical SEO audit and implement necessary fixes across the application.
This commit is contained in:
hamed
2026-07-05 15:47:47 +03:30
parent 522caf6b1b
commit b04bb45ca1
24 changed files with 595 additions and 329 deletions
+29 -13
View File
@@ -1,6 +1,6 @@
import { describe, it, expect, beforeEach } from 'vitest';
import { describe, it, expect } from 'vitest';
import { getStateInfoClient } from '@/lib/getStateInfoClient';
import { getCanonicalUrlClient } from '@/lib/getCanonicalUrl';
import { buildCanonicalUrl, buildCanonicalPath, normalizeHost } from '@/lib/getCanonicalUrl';
function setLocation(loc) {
Object.defineProperty(window, 'location', { value: loc, writable: true, configurable: true });
@@ -21,22 +21,38 @@ describe('getStateInfoClient (window)', () => {
});
});
describe('getCanonicalUrlClient (window)', () => {
beforeEach(() => {
setLocation({ host: 'arak-nobat.ir', pathname: '/doctors' });
describe('buildCanonicalUrl (self-canonical per-host)', () => {
it('دامنه‌ی شهری → self-canonical روی همان دامنه', () => {
expect(buildCanonicalUrl('arak-nobat.ir', '/doctors')).toBe('https://arak-nobat.ir/doctors');
});
it('subdomain → canonical به دامنه‌ی اصلی', () => {
expect(getCanonicalUrlClient()).toBe('https://nobat724.com/doctors');
it('دامنه‌ی اصلی → self-canonical روی دامنه‌ی اصلی', () => {
expect(buildCanonicalUrl('nobat724.com', '/doctors')).toBe('https://nobat724.com/doctors');
});
it('دامنه‌ی اصلی → null', () => {
setLocation({ host: 'nobat724.com', pathname: '/doctors' });
expect(getCanonicalUrlClient()).toBeNull();
it('www و حروف بزرگ نرمال می‌شوند', () => {
expect(buildCanonicalUrl('WWW.Nobat724.com', '/x')).toBe('https://nobat724.com/x');
});
it('www و حروف بزرگ نرمال می‌شوند (دامنه‌ی اصلی) → null', () => {
setLocation({ host: 'WWW.Nobat724.com', pathname: '/x' });
expect(getCanonicalUrlClient()).toBeNull();
it('هاست dev با پورت → http و حفظ پورت', () => {
expect(buildCanonicalUrl('yazd-nobat.localhost:3000', '/doctors')).toBe(
'http://yazd-nobat.localhost:3000/doctors'
);
});
it('query string و trailing slash حذف می‌شوند', () => {
expect(buildCanonicalUrl('arak-nobat.ir', '/doctors/?specialty=قلب')).toBe(
'https://arak-nobat.ir/doctors'
);
});
it('ریشه دست‌نخورده می‌ماند', () => {
expect(buildCanonicalUrl('arak-nobat.ir', '/')).toBe('https://arak-nobat.ir/');
expect(buildCanonicalPath('/')).toBe('/');
});
it('هاست خالی → دامنه‌ی پیش‌فرض', () => {
expect(normalizeHost('')).toBe('nobat724.com');
expect(buildCanonicalUrl(null, '/x')).toBe('https://nobat724.com/x');
});
});