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
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:
@@ -130,6 +130,28 @@ Neden gerekli: arşivlenmezse eski kodlu satırlar listelerde bir yıl önceki s
|
|||||||
görünmeye devam eder; öğrenci o kodu tercih ekranında bulamaz, kodu değişen program
|
görünmeye devam eder; öğrenci o kodu tercih ekranında bulamaz, kodu değişen program
|
||||||
iki kez listelenir.
|
iki kez listelenir.
|
||||||
|
|
||||||
|
### 5b. Kapanan sayfaları yönlendir (5–15 dk)
|
||||||
|
|
||||||
|
`--kuru` raporundaki `KAPANACAK /bolum/<slug>` ve `KAPANACAK /universite/<slug>`
|
||||||
|
listelerindeki her adres (ve `--kimlik-onar` sonrası kapanan sayfa olduysa onlar da)
|
||||||
|
`src/lib/kapanan-sluglar.ts` içindeki `KAPANAN_SLUGLAR` listesine eklenir; site bu
|
||||||
|
adresleri yaşayan en yakın sayfaya **kalıcı (308)** yönlendirir (`next.config.ts` →
|
||||||
|
`redirects()`, `/sayfa/N` alt yolları dahil). Eklemezsen kapanan adres Google'da
|
||||||
|
"sayfa yok" gövdesiyle kalır.
|
||||||
|
|
||||||
|
- Hedef sırası: (1) program/kurum **ad değiştirdiyse yeni adı** — kanıt: aynı
|
||||||
|
üniversitede geçmiş yıl sıraları yeni adlı satıra birebir taşınmış, ya da Resmî
|
||||||
|
Gazete kararı; (2) aynı alanın lisans/önlisans karşılığı; (3) emin değilsen hub:
|
||||||
|
`/bolumler` ya da `/universiteler`. Uydurma eşleme yapma; `gerekce` alanına kanıtı yaz.
|
||||||
|
- Hedef slug `programs` tablosundan türemeli ve kendisi listede **kaynak** olmamalı
|
||||||
|
(zincir). Zinciri dosyadaki `kapananYonlendirmeleri()` build'de yakalar; hedefin
|
||||||
|
yaşadığını sen kontrol et: 8. adımda hedef adresi tarayıcıda aç.
|
||||||
|
- Bu yıl **yeniden açılan** bir sayfa listede kaynak olarak duruyorsa kaydını sil —
|
||||||
|
yönlendirme sayfadan önce çalışır, silmezsen yeni sayfa hiç görünmez. Kontrol:
|
||||||
|
8. adımda listedeki `kaynak` adlarını `/bolumler` ve `/universiteler` sayfasında ara;
|
||||||
|
çıkan varsa kaydını sil.
|
||||||
|
- Hedef seçimi SEO'yu etkilediği için **[BİLAL] kararıdır**; listeyi commit'ten önce göster.
|
||||||
|
|
||||||
## 6. İndeks + dosyayı toparla (1 dk)
|
## 6. İndeks + dosyayı toparla (1 dk)
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
|
|||||||
@@ -1,5 +1,8 @@
|
|||||||
import type { NextConfig } from "next";
|
import type { NextConfig } from "next";
|
||||||
import { HTML_LIMITED_BOT_UA_RE } from "next/dist/shared/lib/router/utils/html-bots";
|
import { HTML_LIMITED_BOT_UA_RE } from "next/dist/shared/lib/router/utils/html-bots";
|
||||||
|
// Bağımlılıksız veri dosyası; config uygulama paketinden önce yüklendiği için
|
||||||
|
// göreli yolla alınır (Docker builder'da src/ build'den önce kopyalanır).
|
||||||
|
import { kapananYonlendirmeleri } from "./src/lib/kapanan-sluglar";
|
||||||
|
|
||||||
// Dockerfile builder katmanı BUILD_KAYNAK_KISITLI=1 verir: imaj build'i prod
|
// Dockerfile builder katmanı BUILD_KAYNAK_KISITLI=1 verir: imaj build'i prod
|
||||||
// VPS'te çalışan uygulamayla aynı makinede koştuğu için bellek/paralellik kısılır.
|
// VPS'te çalışan uygulamayla aynı makinede koştuğu için bellek/paralellik kısılır.
|
||||||
@@ -75,6 +78,10 @@ const nextConfig: NextConfig = {
|
|||||||
{ source: "/sohbet", destination: "/listem", permanent: false },
|
{ source: "/sohbet", destination: "/listem", permanent: false },
|
||||||
// Ayrı robot sayfası kaldırıldı; rehber içi linkler hero formuna düşer.
|
// Ayrı robot sayfası kaldırıldı; rehber içi linkler hero formuna düşer.
|
||||||
{ source: "/tercih-robotu", destination: "/#hero-form", permanent: true },
|
{ source: "/tercih-robotu", destination: "/#hero-form", permanent: true },
|
||||||
|
// Veri güncellemesiyle tamamen kapanan /bolum ve /universite sayfaları
|
||||||
|
// (sayfalama alt yolları dahil) yaşayan en yakın sayfaya kalıcı (308)
|
||||||
|
// gider. Eşlemenin tek kaynağı src/lib/kapanan-sluglar.ts.
|
||||||
|
...kapananYonlendirmeleri(),
|
||||||
];
|
];
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|||||||
249
src/lib/kapanan-sluglar.ts
Normal file
249
src/lib/kapanan-sluglar.ts
Normal 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 };
|
||||||
|
});
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user