feat(seo): kapanan 28 bölüm + 2 üniversite sayfası benzer sayfaya kalıcı yönlendirilir
All checks were successful
Deploy / deploy (push) Successful in 6m50s

Arşivlenen slug'lar 200 + 'sayfa yok' dönüyordu (soft 404). Eşlemenin tek kaynağı
src/lib/kapanan-sluglar.ts; alt yollar (/sayfa/N) hedefin köküne gider; zincir ya da
çift kaynak build'i durdurur. Yıllık güncelleme kılavuzuna 5b adımı eklendi.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
bilalgursen
2026-09-21 23:34:52 +03:00
parent 992a01abf1
commit 507bf53a95
3 changed files with 278 additions and 0 deletions

249
src/lib/kapanan-sluglar.ts Normal file
View File

@@ -0,0 +1,249 @@
/**
* Kapanan katalog sayfaları → yaşayan en yakın sayfa (kalıcı yönlendirme).
*
* Neden var: yıllık veri güncellemesinde son kılavuzda olmayan program satırları
* `programs_arsiv`'e taşınır; bir bölüm adının ya da üniversitenin bütün
* satırları giderse /bolum/<slug> ya da /universite/<slug> sayfası tamamen
* kapanır. Bu URL'ler arama sonuçlarında ve dış linklerde yaşamaya devam eder;
* "sayfa yok" göstermek yerine adı/alanı en yakın yaşayan sayfaya 308 verilir.
* Tek tüketici `next.config.ts` içindeki `redirects()`'tir.
*
* Yıllık güncellemede (docs/veri/yillik-guncelleme.md, 5. adım):
* `pnpm eski-arsivle --kuru` çıktısındaki "tamamen kapanan" slug'lar buraya
* eklenir. Hedef seçimi sırasıyla: (1) program/kurum ad değiştirdiyse yeni adı
* (kanıt: aynı üniversitede geçmiş yıl sıraları birebir taşınmış satır, ya da
* resmî karar), (2) aynı alanın lisans/önlisans karşılığı, (3) emin
* olunamıyorsa hub (`/bolumler`, `/universiteler`). Uydurma eşleme yapılmaz.
*
* Kurallar:
* - `hedef` yaşayan bir sayfa olmalı (slug `programs` tablosundan türemeli).
* - `hedef` başka bir kaydın `kaynak`'ı olamaz (zincir/döngü) —
* `kapananYonlendirmeleri()` bunu build'de sınar ve ihlâlde durur.
* - Kapanan bir sayfa ileride yeniden açılırsa (program kılavuza dönerse)
* kaydı SİL; yoksa yönlendirme dosya sisteminden önce çalıştığı için yeni
* sayfa hiç görünmez.
*
* Bu dosya `next.config.ts`'ten, uygulama paketinin dışında yüklenir: bağımlılıksız
* kalmalı — `server-only`, DB ya da başka bir uygulama modülü import ETME.
*/
export type KapananSlug = {
/** Kapanan sayfanın yolu, sonda eğik çizgi yok: `/bolum/<slug>` | `/universite/<slug>` */
kaynak: `/bolum/${string}` | `/universite/${string}`;
/** Yaşayan hedef sayfa ya da hub */
hedef: `/bolum/${string}` | `/universite/${string}` | "/bolumler" | "/universiteler";
/** Hedefin neden seçildiği (kanıt türüyle) */
gerekce: string;
};
/** 2026 veri yayını (21 Eylül 2026): 28 bölüm + 2 üniversite sayfası kapandı. */
export const KAPANAN_SLUGLAR: readonly KapananSlug[] = [
// ---- Bölümler: ad değişikliği veriyle kanıtlı (geçmiş sıralar yeni ada taşınmış) ----
{
kaynak: "/bolum/radyo-ve-televizyon-programciligi",
hedef: "/bolum/medya-ve-iletisim",
gerekce:
"Önlisans programı 2024'ten sonra kılavuzda yok; İzmir Ekonomi Ü. MYO'da geçmiş sıralar Medya ve İletişim'e taşınmış (ardıl ad), hedefte 21 önlisans programı var",
},
{
kaynak: "/bolum/iletisim-sanatlari",
hedef: "/bolum/halkla-iliskiler-ve-reklamcilik",
gerekce:
"Tek kurum (İstanbul Kültür Ü. Sanat ve Tasarım Fak.); 3 satırın 2023 sıraları aynı fakültedeki Halkla İlişkiler ve Reklamcılık satırlarına taşınmış",
},
{
kaynak: "/bolum/cevre-temizligi-ve-denetimi",
hedef: "/bolum/cevresel-olcum-ve-izleme-sistemleri-teknikerligi",
gerekce:
"Tek kurum (Kocaeli Ü. Hereke Asım Kocabıyık MYO); geçmiş sırası aynı MYO'daki yeni adlı programa taşınmış",
},
{
kaynak: "/bolum/atik-yonetimi",
hedef: "/bolum/su-ve-atik-yonetimi-teknikerligi",
gerekce:
"Tek kurum (Karamanoğlu Mehmetbey Ü.); geçmiş sırası aynı üniversitedeki Su ve Atık Yönetimi Teknikerliği'ne taşınmış",
},
{
kaynak: "/bolum/emlak-ve-emlak-yonetimi",
hedef: "/bolum/gayrimenkul-gelistirme-ve-yonetimi",
gerekce:
"Tek kurum (Ankara Hacı Bayram Veli Ü. Tapu Kadastro YO); geçmiş sırası aynı okuldaki Gayrimenkul Geliştirme ve Yönetimi'ne taşınmış",
},
{
kaynak: "/bolum/meteoroloji-muhendisligi",
hedef: "/bolum/iklim-bilimi-ve-meteoroloji-muhendisligi",
gerekce:
"Tek kurum (Samsun Ü.); program aynı fakültede İklim Bilimi ve Meteoroloji Mühendisliği adıyla sürüyor",
},
{
kaynak: "/bolum/endustri-yonetimi-muhendisligi",
hedef: "/bolum/endustri-muhendisligi",
gerekce:
"Tek kurum (Uluslararası Balkan Ü.); aynı program kimlikleri 2026 kılavuzunda Endüstri Mühendisliği adıyla",
},
{
kaynak: "/bolum/taki-tasarimi",
hedef: "/bolum/kuyumculuk-ve-mucevher-tasarimi",
gerekce:
"Lisans; Altınbaş Ü. Uygulamalı Bilimler Fak.'nde Takı Tasarımı 2024'te bitti, aynı fakültede 2025'ten itibaren Kuyumculuk ve Mücevher Tasarımı var",
},
{
kaynak: "/bolum/islam-bilimleri",
hedef: "/bolum/ilahiyat",
gerekce:
"Sayfanın tek satırı (Kırgızistan-Türkiye Manas Ü. İlahiyat Fak., kimlik 405210389) 2026 kılavuzunda İlahiyat adıyla",
},
{
kaynak: "/bolum/bati-dilleri",
hedef: "/bolum/filoloji",
gerekce:
"Tek kurum (Manas Ü. Edebiyat Fak.); 2024'te kapandı, aynı fakültede 2025'ten itibaren Filoloji (İngiliz Dili ve Edebiyatı) açıldı",
},
{
kaynak: "/bolum/dogu-dilleri",
hedef: "/bolum/filoloji",
gerekce:
"Tek kurum (Manas Ü. Edebiyat Fak.); Batı Dilleri ile aynı yeniden yapılanma, fakültenin dil programları Filoloji altında",
},
// ---- Bölümler: aynı alanın lisans karşılığı / ad yakınlığı ----
{
kaynak: "/bolum/uygulamali-ingilizce-cevirmenlik",
hedef: "/bolum/ingilizce-mutercim-ve-tercumanlik",
gerekce:
"Önlisans programı 2024'ten sonra kılavuzda yok, önlisansta çeviri programı kalmadı; aynı alanın lisans karşılığı",
},
{
kaynak: "/bolum/uygulamali-ispanyolca-cevirmenlik",
hedef: "/bolum/ispanyolca-mutercim-ve-tercumanlik",
gerekce: "Önlisans programı kapandı; aynı alanın lisans karşılığı",
},
{
kaynak: "/bolum/menkul-kiymetler-ve-sermaye-piyasasi",
hedef: "/bolum/sermaye-piyasasi",
gerekce: "Önlisans programı kapandı; aynı alanın lisans karşılığı",
},
{
kaynak: "/bolum/siyasal-bilimler",
hedef: "/bolum/siyaset-bilimi",
gerekce: "Tek kurum (Uluslararası Balkan Ü.); eş anlamlı ad",
},
{
kaynak: "/bolum/uluslararasi-ekonomi",
hedef: "/bolum/ekonomi",
gerekce: "Tek kurum (Uluslararası Balkan Ü.); adı en yakın yaşayan bölüm",
},
{
kaynak: "/bolum/girisimcilik",
hedef: "/bolum/uluslararasi-girisimcilik",
gerekce: "Tek kurum (Özyeğin Ü.); adı en yakın yaşayan bölüm",
},
{
kaynak: "/bolum/film-tasarimi-ve-yazarligi",
hedef: "/bolum/film-tasarimi-ve-yonetimi",
gerekce: "Tek kurum (Dokuz Eylül Ü. GSF); aynı alan, adı en yakın yaşayan bölüm",
},
{
kaynak: "/bolum/film-tasarimi-ve-yonetmenligi",
hedef: "/bolum/film-tasarimi-ve-yonetimi",
gerekce: "Tek kurum (Dokuz Eylül Ü. GSF); aynı alan, adı en yakın yaşayan bölüm",
},
{
kaynak: "/bolum/muhendislik-programlari",
hedef: "/bolum/muhendislik-ve-doga-bilimleri-programlari",
gerekce:
"TED Ü. bölümsüz mühendislik girişi kapandı; aynı türden (fakülteye giriş, bölüm sonradan) yaşayan tek sayfa",
},
{
kaynak: "/bolum/iktisadi-ve-idari-bilimler-programlari",
hedef: "/bolum/yonetim-bilimleri-programlari",
gerekce:
"TED Ü. bölümsüz İİBF girişi kapandı; aynı türden (fakülteye giriş, bölüm sonradan) en yakın yaşayan sayfa",
},
// ---- Bölümler: alan yakınlığı — ardıl ad kanıtı YOK, Bilal onayı bekliyor ----
{
kaynak: "/bolum/spor-yoneticiligi",
hedef: "/bolum/rekreasyon",
gerekce:
"113 satırın tamamı 2026 kılavuzundan çıktı, ardıl ad yok; spor bilimleri fakültelerinde merkezi yerleştirmeyle öğrenci alan kardeş bölüm (Rekreasyon Yönetimi turizm fakültelerinde, o yüzden seçilmedi)",
},
{
kaynak: "/bolum/spor-yonetimi",
hedef: "/bolum/rekreasyon",
gerekce:
"Önlisans programı 2024'ten sonra kılavuzda yok, ardıl ad yok; Spor Yöneticiliği ile aynı hedef",
},
{
kaynak: "/bolum/bilgi-yonetimi",
hedef: "/bolum/bilgi-ve-belge-yonetimi",
gerekce:
"Önlisans programı 2024'ten sonra kılavuzda yok, ardıl ad yok; adı ve alanı en yakın yaşayan (lisans) bölüm",
},
{
kaynak: "/bolum/ambalaj-tasarimi",
hedef: "/bolum/grafik-tasarimi",
gerekce:
"Tek kurum (Fatih Sultan Mehmet Vakıf Ü. MYO), ardıl ad yok; ambalaj tasarımı grafik tasarımın alt dalı, hedefte 119 önlisans programı var",
},
// ---- Bölümler: yakın sayfa yok → hub ----
{
kaynak: "/bolum/nufus-ve-vatandaslik",
hedef: "/bolumler",
gerekce: "Önlisans programı kapandı; ardıl ad ya da alanı yakın yaşayan bölüm yok",
},
{
kaynak: "/bolum/aile-ve-tuketici-bilimleri",
hedef: "/bolumler",
gerekce: "Tek kurum (Hacettepe Ü.); alanı yakın yaşayan bölüm yok",
},
{
kaynak: "/bolum/ev-idaresi",
hedef: "/bolumler",
gerekce: "Tek kurum (Anadolu Ü. AÖF); alanı yakın yaşayan bölüm yok",
},
// ---- Üniversiteler: kurum ad değiştirdi ----
{
kaynak: "/universite/izmir-kavram-meslek-yuksekokulu",
hedef: "/universite/izmir-konak-meslek-yuksekokulu",
gerekce:
"Ad değişikliği: 10929 sayılı Cumhurbaşkanı Kararı, Resmî Gazete 31.01.2026 / 33154; 2026 kılavuzunda yeni adla 72 program",
},
{
kaynak: "/universite/kibris-ilim-universitesi",
hedef: "/universite/kibris-aydin-universitesi",
gerekce:
"Ad değişikliği (Mart 2025); veride Kıbrıs Aydın Ü. satırları Kıbrıs İlim Ü.'nün aynı programlarını ve 2024 sıralarını birebir taşıyor",
},
];
export type KaliciYonlendirme = {
source: string;
destination: string;
permanent: true;
};
/**
* `next.config.ts` → `redirects()` için kurallar. `:yol*` sıfır ya da daha çok
* parça eşler: sayfanın kendisi, `/sayfa/N` sayfalama URL'leri ve diğer alt
* yollar hedefin KÖK sayfasına gider (hedefin sayfa sayısı farklıdır, N taşınmaz).
*/
export function kapananYonlendirmeleri(): KaliciYonlendirme[] {
const kaynaklar = new Set<string>();
for (const { kaynak } of KAPANAN_SLUGLAR) {
if (kaynaklar.has(kaynak)) {
throw new Error(`kapanan-sluglar: "${kaynak}" iki kez tanımlı`);
}
kaynaklar.add(kaynak);
}
return KAPANAN_SLUGLAR.map(({ kaynak, hedef }) => {
if (kaynaklar.has(hedef)) {
throw new Error(
`kapanan-sluglar: "${kaynak}" → "${hedef}" zincir oluşturuyor (hedef de kapanan listesinde)`,
);
}
return { source: `${kaynak}/:yol*`, destination: hedef, permanent: true };
});
}