# Alan Adı Yönlendirme Kancaları

https://dev.wisecp.com/tr/alan-adi-yonlendirme-kancalari

Gelen ziyaretçiyi ve postayı başka bir yere taşıyan sekiz kanca, artı bu iki türü satın alan ek hizmet çağrısı.

## Genel Bakış

Yönlendirmenin iki türü vardır ve ikisi de **aynı ek hizmetin** arkasındadır: adrese geleni taşıyan yönlendirme ve postayı taşıyan yönlendirme.

Aralarında bir sayı farkı var. Adres yönlendirmesi alan adı başına **tektir**, posta yönlendirmesi ise bir **listedir**. Bu fark kancaların parametrelerine de yansır: biri tek bir kayıt taşır, diğeri kaynak ve hedef çiftleri.

## Referans

### Adres yönlendirmesini durdurma

gatedomain.url_forwarding_change

`ClientDomains` kurma ve kaldırma

Yönlendirme sağlayıcıda kurulmadan ya da kaldırılmadan önce çalışır.

Parametreler 3

$servicearrayAlan adı hizmet kaydı.

$fwdarrayYönlendirme: `protocol` (`http`/`https`), `target` (şemasız hedef, sondaki eğik çizgi kırpılmış), `method` (`301`/`302`). Kaldırma çağrısında **boş dizi** gelir.

$verbstring`save` ya da `cancel`.

Dönüş 1

stringBoş olmayan bir string işlemi **durdurur**; metin hata olarak fırlatılır ve sağlayıcı çağrılmaz.

Dinleyici PHP

```php
Hook::add('gate:domain.url_forwarding_change', 10,
    function ($service, $fwd, $verb) {
        if ($verb === 'cancel') return null;          // kaldirmaya karisma

        // Kalici yonlendirme tarayicida saklanir; guvensiz hedefe izin verme.
        if (($fwd['protocol'] ?? '') !== 'https' && (int) ($fwd['method'] ?? 0) === 301)
            return 'Kalici yonlendirme yalniz guvenli adrese yapilir.';

        return null;
    });
```

### Adres yönlendirmesini izleme

actiondomain.url_forwarding_changed

`ClientDomains` yalnız başarıda

Yönlendirme sağlayıcıda kurulduktan ya da kaldırıldıktan sonra çalışır.

Parametreler 3

$servicearrayAlan adı hizmet kaydı.

$fwdarrayKurulan yönlendirme. Kaldırma çağrısında boş dizi; hedefi buradan okumaya çalışmayın.

$verbstringYapılan işlem.

Dönüş 1

voidDönüş yoksayılır.

Dinleyici PHP

```php
Hook::add('action:domain.url_forwarding_changed', 10,
    function ($service, $fwd, $verb) {
        Audit::note('forwarding', $service['name'] ?? '',
            $verb === 'cancel' ? 'kaldirildi' : ($fwd['target'] ?? ''));
    });
```

### Okunan yönlendirmeyi değiştirme

filterdomain.url_forwarding

`Hook::runRefs` referansla

Sağlayıcıdan okunan yönlendirme normalleştirildikten sonra, ekrana gitmeden önce çalışır.

Parametreler 2

$forwardingarrayrefTek kayıt: `active`, `protocol`, `method`, `domain` (şemasız hedef), `url` (tam adres). `active` ekranın "yönlendirme var mı" durumunu, `url` ise hedef kutusunun ön dolumunu belirler.

$servicearrayAlan adı hizmet kaydı.

Dönüş 1

voidDeğer **referansla** değişir; dönüş kullanılmaz.

Dinleyici PHP

```php
Hook::add('filter:domain.url_forwarding', 10, function (&$forwarding, $service) {
    // active ile url birlikte tutarli olmali: biri dolu digeri bos kalmasin.
    if (empty($forwarding['url'])) $forwarding['active'] = false;
});
```

### Posta yönlendirmesini durdurma

gatedomain.email_forward_save

`ClientDomains` ekleme ve silme

Posta yönlendirme kuralı sağlayıcıda eklenmeden ya da silinmeden önce çalışır.

Parametreler 4

$servicearrayAlan adı hizmet kaydı.

$prefixstringAlan adındaki yerel kısım. Yalnız kısım gelir, tam adres değil: `info` demek `info@example.com` demektir.

$targetstringHedef kutu. Silmede boş gelebilir.

$verbstring`create` ya da `delete`.

Dönüş 1

stringBoş olmayan bir string işlemi **durdurur**; metin hata olarak fırlatılır ve sağlayıcı çağrılmaz.

Dinleyici PHP

```php
Hook::add('gate:domain.email_forward_save', 10,
    function ($service, $prefix, $target, $verb) {
        if ($verb === 'delete') return null;

        // Yonetim kutularini disari yonlendirmek hesap devralmaya kapi acar.
        if (in_array(strtolower($prefix), ['admin', 'postmaster', 'hostmaster'], true))
            return 'Bu yerel kisim yonlendirilemez.';

        return null;
    });
```

### Posta yönlendirmesini izleme

actiondomain.email_forward_saved

`ClientDomains` yalnız başarıda

Kural sağlayıcıda işlendikten sonra çalışır.

Parametreler 4

$servicearrayAlan adı hizmet kaydı.

$prefixstringKaynağın yerel kısmı.

$targetstringHedef kutu.

$verbstringYapılan işlem.

Dönüş 1

voidDönüş yoksayılır.

Dinleyici PHP

```php
Hook::add('action:domain.email_forward_saved', 10,
    function ($service, $prefix, $target, $verb) {
        MailAudit::rule($verb, $prefix . '@' . ($service['name'] ?? ''), $target);
    });
```

### Yönlendirme listesini değiştirme

filterdomain.email_forwards

`Hook::runRefs` referansla

Sağlayıcıdan okunan kurallar normalleştirildikten sonra çalışır.

Parametreler 2

$forwardsarrayrefKural listesi: her satır `identity`, `prefix`, `source` (`prefix@alanadı`) ve `target` taşır. Silme çağrısı bu üç alanı geri gönderir; düşürmeyin.

$servicearrayAlan adı hizmet kaydı.

Dönüş 1

voidDeğer **referansla** değişir; dönüş kullanılmaz.

Dinleyici PHP

```php
Hook::add('filter:domain.email_forwards', 10, function (&$forwards, $service) {
    // identity/prefix/target ucunu de KORU: silme bunlarla hedefler.
    usort($forwards, fn ($a, $b) => strcmp($a['prefix'] ?? '', $b['prefix'] ?? ''));
});
```

### Ek hizmet satın almayı durdurma

gatedomain.addon_purchase

`ClientDomains` fatura kesilmeden

Müşteri ek hizmeti satın almadan, **hiçbir kayıt oluşmadan** çalışır.

Parametreler 2

$servicearrayAlan adı hizmet kaydı.

$addonKeystringSatın alınan ek hizmet: `dns-manage`, `whois-privacy` ya da `forwarding`. Anahtar **tireli** yazılır; alt çizgi eşleşmez.

Dönüş 1

stringBoş olmayan bir string satın almayı **durdurur**; müşteriye hata olarak döner ve **hiçbir kayıt oluşmaz**.

Dinleyici PHP

```php
Hook::add('gate:domain.addon_purchase', 10, function ($service, $addonKey) {
    // Suresi dolmak uzere olan ada yillik ek hizmet satmak dogru degil.
    if (Acme::daysLeft($service) < 30)
        return 'Alan adinin suresi dolmak uzere; once yenileyin.';

    return null;
});
```

### Ek hizmet siparişini izleme

actiondomain.addon_ordered

`ClientDomains` fatura ödenmemiş

Sipariş kurulduktan sonra çalışır. Ek hizmet bu noktada **beklemededir**: faturası ödenene kadar etkinleşmez.

Parametreler 3

$servicearrayAlan adı hizmet kaydı.

$addonKeystringSipariş edilen ek hizmet.

$contextarraySipariş bağlamı: `invoice_id` (kesilen **ödenmemiş** fatura), `addon_id` (bekleyen kayıt), `addon_name`.

Dönüş 1

voidDönüş yoksayılır.

Dinleyici PHP

```php
Hook::add('action:domain.addon_ordered', 10,
    function ($service, $addonKey, $context) {
        // Hizmet HENUZ acik degil: faturasi odenince etkinlesir.
        Crm::pendingAddon((int) ($context['invoice_id'] ?? 0), $addonKey);
    });
```

## Tuzaklar

> **Kaldırma çağrısında yönlendirme boş gelir**
> 
> Adres yönlendirmesi kaldırılırken kanca ikinci parametreyi **boş dizi** olarak verir. Eski hedefi oradan okumaya çalışan bir dinleyici boş bulur ve sessizce yanlış iş yapar. Neyin kaldırıldığını bilmeniz gerekiyorsa **kapıda** okuyup saklayın.

> **Posta kancasında yerel kısım gelir**
> 
> Kaynak parametresi **yalnız yerel kısımdır**, tam adres değil. Alan adını kendiniz eklemeniz gerekir ve bunu yaparken hizmet kaydındaki addan alın. Tam adres bekleyen bir dinleyici, kayıt eşleştirmesinde **hiçbir şey** bulamaz.

> **Sipariş kancası hizmetin açıldığı an değildir**
> 
> Ek hizmet siparişi kesildiğinde kayıt **beklemede**, faturası ise **ödenmemiş** durumdadır. Erişimi burada açmaya kalkmak, parası ödenmemiş bir hizmeti teslim etmek olur. Gerçek açılış ödeme tarafındaki kancalarda olur.

> **Ek hizmet anahtarı tirelidir**
> 
> Anahtarlar `dns-manage`, `whois-privacy`, `forwarding` biçimindedir. Alt çizgiyle yazmak sessizce eşleşmez: dinleyiciniz çalışır ama koşulunuz **hiçbir zaman** tutmaz.

## İlgili Makaleler

- [Alan Adı DNS Kancaları](https://dev.wisecp.com/tr/alan-adi-dns-kancalari)
- Fatura ve Ödeme Kancaları
- Alan Adı Kancaları
