SSD Nodes Learn Hosting plans →
Rehberler Matt ConnorYazan Matt Connor · Güncellendi 2026-08-21

nginx üzerinde Onion-Location başlığı nasıl eklenir

nginx vhost dosyanıza Onion-Location başlığını ekleyerek Tor Browser üzerinden onion adresinize yönlendirme sağlayın. Sızıntıları önlemek için gereken yapılandırma adımları.

Onion-Location başlığı ne işe yarar

Onion-Location başlığı, clearnet vhost dosyanızda yer alan ve onion adresinizi Tor Browser'a tanıtan tek satırlık bir yapılandırmadır. https://example.com adresine Tor üzerinden erişen bir ziyaretçi, adres çubuğunda .onion available yazan mor bir hap simgesi görür; tek bir tıklama ile ziyaretçi onion servisinize yönlendirilir. Bu, yalnızca bir keşif mekanizmasıdır. Başlık, onion servisini oluşturmaz ve hakkınızda herhangi bir gizlilik sağlamaz.

Bu kılavuz, her iki parçanın da halihazırda var olduğunu varsayar. nginx arkasında çalışan bir VPS üzerinde siteniz ve bu siteye işaret eden çalışan bir v3 onion servisiniz bulunmaktadır. Eğer ikinci kısım henüz hazır değilse, önce onu oluşturun: VPS üzerinde onion sitesi barındırma rehberi, gerekli torrc satırlarını ve ilk hostname dosyasını kapsamaktadır. Aşağıdaki adımlar, bu iki yapıyı birbirine sızdırmadan birleştirmeyi anlatmaktadır.

Tor Browser'ın başlığı dikkate alması için gerekenler

Tor Project üç koşul belirtmektedir. Bu üç koşulun tamamı sağlanmalıdır, aksi takdirde hap simgesi görüntülenmez.

  • Onion-Location değeri, http: veya https: şemasına ve .onion ana makine adına sahip geçerli bir URL olmalıdır.
  • Başlığı tanımlayan web sayfası HTTPS üzerinden sunulmalıdır.
  • Başlığı tanımlayan web sayfasının kendisi bir onion sitesi olmamalıdır.

İkinci koşul kullanıcıların sıklıkla gözden kaçırdığı noktadır; üçüncü koşul ise bu başlığın neden onion vhost üzerinde ayarlanmaması gerektiğini açıklar. Belgelerde yazılı olmayan ancak uygulamada yer alan dördüncü bir kural daha mevcuttur: Tor Browser, başlığı yalnızca üst düzey belge (top-level document) için işleme alır. Kod, herhangi bir işlem yapmadan önce yükleme hedefini belge ile karşılaştırır; bu nedenle bir stil dosyası, görsel veya API yanıtı üzerinde döndürülen başlık yok sayılır.

Tarayıcı varsayılan olarak hap simgesini gösterir ve tıklanmasını bekler. Otomatik geçiş isteyen bir okuyucu, bunu Ayarlar, ardından Gizlilik ve Güvenlik, daha sonra Onion Hizmetleri altından etkinleştirebilir; burada "Bilinen .onion sitelerine öncelik ver" seçeneği "Her zaman" olarak ayarlanabilir. Bunu sunucu tarafından zorunlu kılamazsınız. Başlığı bir yönlendirme olarak değil, bir teklif olarak değerlendirin.

Nginx üzerinde Onion-Location başlığını ekleme

Bu başlık, clearnet alan adınız için TLS sonlandırması yapan server bloğuna eklenmelidir. Başlığı 80 numaralı port bloğuna koyarsanız hiçbir işlem gerçekleşmez; çünkü bu blok yalnızca yönlendirme yapar ve ikinci kural, düz HTTP sayfası üzerinde tanımlanan bir başlığı geçersiz kılar.

server {
    listen 443 ssl;
    server_name example.com;

    ssl_certificate     /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

    add_header Onion-Location http://<your-onion-address>.onion$request_uri always;

    root /srv/example.com/public;
}

$request_uri, yol ve sorgu dizisini taşır; böylece https://example.com/guides/tor üzerindeki bir okuyucuya onion adresinde de aynı yol sunulur. Bu ifadeyi çıkarırsanız, tüm ziyaretçiler okudukları sayfa yerine onion ana sayfasına yönlendirilir.

always, Nginx'teki belgelenmiş bir sınırlama nedeniyle önemlidir. add_header, alanı yalnızca yanıt kodu 200, 201, 204, 206, 301, 302, 303, 304, 307 veya 308 olduğunda ekler. 404 sayfanız arama sonuçlarından gelen gerçek bir giriş noktasıdır ve always olmadan bu sayfa hiçbir başlık taşımaz.

İkinci Nginx tuzağı kalıtımdır ve sessizce başarısız olur. add_header yönergeleri, mevcut seviyede herhangi bir add_header yönergesi yoksa bir önceki yapılandırma seviyesinden devralınır. Bu nedenle bir location /assets/ { add_header Cache-Control ...; } bloğu, altındaki tüm URL'ler için sunucu seviyesindeki Onion-Location ayarını devre dışı bırakır. Eğer herhangi bir yerde location bazlı başlıklar ayarlıyorsanız, Onion-Location satırını bu blokların her birinin içinde tekrarlayın. Bu davranış sizin için yeniyse Nginx'in bir server ve location bloğunu nasıl seçtiği konusunu okumanızda fayda vardır.

Yapılandırmayı yeniden yükleyin ve hem normal bir sayfayı hem de mevcut olmayan bir sayfayı kontrol edin:

sudo nginx -t && sudo systemctl reload nginx
curl -sI https://example.com/ | grep -i onion-location
curl -sI https://example.com/no-such-page | grep -i onion-location

Her iki komut da bir onion-location: satırı yazdırmalıdır. İkinci komut, always ayarının çalıştığının kanıtıdır. İkinci komuttan çıktı alınamaması, bayrağın eksik olduğu veya bir location bloğunun yönergeyi gölgelediği anlamına gelir.

HTTP başlıklarını ayarlayamadığınız durumlarda HTML meta etiketi

Statik barındırma servisleri ve bazı CDN panelleri, isteğe bağlı yanıt başlıkları eklemenize izin vermez. Aynı değer, belge başlığında bir meta öğesi olarak da çalışır; çünkü tarayıcı, verinin HTTP üzerinden mi yoksa bir http-equiv etiketi olarak mı geldiğine bakmaksızın aynı belge başlığı verisi üzerinden okuma yapar.

<meta http-equiv="onion-location" content="http://<your-onion-address>.onion" />

Üç gereksinim hala geçerlidir. Etiketi taşıyan sayfa HTTPS olmalı ve bir onion adresi olmamalıdır. Fark şudur: Etiket, sunucu tarafında genişletilebilecek bir değişken bulunmadığından, yol içermeyen sabit bir adres tutar. Bu etiketi taşıyan her sayfa, onion ana sayfasını sunar. Bu, yedekleme yönteminin getirdiği bir kısıtlamadır; bu nedenle sunucu üzerinde kontrolünüz olduğu sürece HTTP başlığını tercih edin.

Onion servisini kendi nginx vhost'u üzerinden sunma

Clearnet sitesi ve onion servisi aynı sunucu bloğunu paylaşmamalıdır. Tor Browser, Host: <your-onion-address>.onion gönderir. Eğer hiçbir sunucu bloğu bu ismi talep etmezse, nginx varsayılan sunucuya (clearnet vhost'unuza) döner ve o vhost tarafından oluşturulan her URL, alan adınızı belirtir.

Gizli servisi yalnızca loopback arayüzünün yanıt verdiği bir porta yönlendirin:

HiddenServiceDir /var/lib/tor/onion_site/
HiddenServicePort 80 127.0.0.1:8080

Ardından bu porta kendi vhost'unu atayın:

server {
    listen 127.0.0.1:8080;
    server_name <your-onion-address>.onion;

    absolute_redirect off;
    port_in_redirect off;

    root /srv/example.com/public;
}

listen 127.0.0.1:8080, bu vhost'u genel IP adresinizden uzak tutar; böylece VPS adresinizi tarayan biri, içeriği çekip clearnet kopyasıyla bayt bazında karşılaştıramaz. absolute_redirect off, nginx'in göreceli Location değerleri üretmesini sağlar; bu sayede bir dizin üzerindeki eğik çizgi (trailing-slash) yönlendirmesi, tam bir URL yerine Location: /guides/ döndürür. nginx, mutlak yönlendirmeleri server_name yerine Host başlığından oluşturur çünkü server_name_in_redirect varsayılan olarak off değerindedir; ancak göreceli bir yönlendirme bu soruyu tamamen ortadan kaldırır.

Onion sayfası neden ziyaretçileri hala clearnet sitesine yönlendiriyor?

Sızıntının kaynağı nadiren nginx'tir. Sorun genellikle uygulamanızdadır. Yapılandırılmış bir site adresinden mutlak (absolute) URL oluşturan her şey, isteği hangi vhost karşılamış olursa olsun alan adınızı gösterecektir.

  • https://example.com/... adresine işaret eden bir rel="canonical" bağlantı etiketi. Bu en yaygın durumdur ve kaynak kodunu görüntüleyen herkese doğrudan clearnet sayfasını gösterir.
  • Django'nun SECURE_SSL_REDIRECT veya WordPress'in home ve siteurl seçenekleri gibi, nginx yerine uygulama çatısı tarafından oluşturulan yönlendirmeler.
  • og:url ve diğer sosyal medya kartı meta etiketleri.
  • Spesifikasyon gereği mutlak olması gereken site haritası ve RSS girdileri.
  • Genellikle aynı ayardan türetilen "ana sayfaya dön" bağlantısını içeren uygulama hata sayfaları.

Çözüm kullandığınız teknoloji yığınına bağlıdır ve tek bir genel çözüm yolu yoktur. Ancak kontrol yöntemi standarttır. Onion sayfasını Tor üzerinden çekin ve yanıt içerisinde alan adınızı aratın.

curl -s --socks5-hostname 127.0.0.1:9050 http://<your-onion-address>.onion/ \
  | grep -i 'example\.com'

--socks5-hostname, isim çözümlemesi için ismi Tor'un SOCKS portuna gönderir; bu gereklidir çünkü makinenizdeki hiçbir servis bir .onion ismini yerel olarak çözümleyemez. 9050 portu, paketlenmiş bir tor daemon için varsayılan değerdir. Boş bir sonuç başarılı olduğunuzu gösterir. Herhangi bir eşleşme, onion ziyaretçilerine clearnet alan adınızı veren bir sayfa olduğu anlamına gelir. Bu komutu ana sayfada ve ardından 404 hatası üreten bir URL üzerinde çalıştırın.

Yönlendirme zincirini ayrı olarak kontrol edin, çünkü bir yönlendirme yanıtının gövdesi genellikle boştur:

curl -sI --socks5-hostname 127.0.0.1:9050 http://<your-onion-address>.onion/guides \
  | grep -i '^location'

example.com değerini içeren bir Location, bir yönlendirmenin onion ziyaretçisini, Tor içerisinde kaldığını düşündüğü bir istekte, bir çıkış düğümü (exit node) üzerinden clearnet'e geri gönderdiği anlamına gelir.

Clearnet sertifikanızı onion üzerinde sunmayın

Bir v3 onion adresi, servisin kendi genel anahtarından türetilir; bu nedenle Tor, herhangi bir HTTP isteği gönderilmeden önce o spesifik servise giden devreyi doğrular ve şifreler. Bir onion servisi içerisinde düz HTTP kullanmak standart yapılandırmadır ve bu durum internet üzerindeki düz HTTP ile aynı şey değildir.

Eğer onion vhost yapılandırmasını clearnet yapılandırmasını kopyalayarak oluşturursanız, ssl_certificate dosyasını da beraberinde kopyalamış olursunuz. Bu durumda onion servisi, subject alternative names listesinde example.com bulunan bir sertifika sunar. Bu durum iki soruna yol açar. Tarayıcı bir isim uyuşmazlığı hatası verir, çünkü URL onion adresidir ve sertifika bu adresi kapsamaz. Ayrıca, uyarıyı geçerek siteye giren her ziyaretçi, bu iki sitenin aynı makine olduğuna dair imzalı bir beyan almış olur. Onion vhost yapılandırmasını kendi server_name dosyasında ayrı tutun. Bu yöntem, aynı zamanda ilgili yapılandırmayı Certbot nginx eklentisi kapsamı dışında tutmanızı sağlar; çünkü bu eklenti, sertifika talep ettiğiniz alan adıyla eşleşen server bloğunu otomatik olarak düzenler.

Hangi tor paketi ve servis anahtarının güvenliği

Ubuntu arşivindeki tor paketi bu iş için uygundur ve ek bir kurulum gerektirmez. Mevcut kararlı serinin gerisinde kaldığı için, sürekli çalışır durumda tutmayı planladığınız bir servis için Tor Project'in kendi Debian deposunu kullanın ve apt aracılığıyla diğer her şeyle birlikte güncellenmesini sağlayın. Ağustos 2026 itibarıyla belgelenen adımlar şunlardır:

sudo apt install apt-transport-https
wget -qO- https://deb.torproject.org/torproject.org/A3C4F0F979CAA22CDBA8F512EE8CBC9E886DDD89.asc \
  | gpg --dearmor \
  | sudo tee /usr/share/keyrings/deb.torproject.org-keyring.gpg >/dev/null

lsb_release -c içindeki sürüm kod adınızla suite kısmını değiştirerek /etc/apt/sources.list.d/tor.sources dosyasını yazın:

Types: deb deb-src
URIs: https://deb.torproject.org/torproject.org/
Suites: noble
Components: main
Signed-By: /usr/share/keyrings/deb.torproject.org-keyring.gpg
sudo apt update
sudo apt install tor deb.torproject.org-keyring

deb.torproject.org-keyring paketi imzalama anahtarını güncel tutar, böylece depo bir yıl sonra doğrulamayı durdurmaz. Tek bir kaynak seçin ve ona bağlı kalın. Arşiv paketi ve depo paketi farklı sürümler içerir; her ikisi de etkinleştirilirse yükseltmeler sırasında apt sizi bunlar arasında geçiş yapmaya zorlayabilir.

HiddenServiceDir dizini servis kimliğinizi tutar. Bu dizindeki hs_ed25519_secret_key dosyası, onion adresinizin ta kendisidir; çünkü adres, bu anahtar çiftinin herkese açık olan yarısıdır. Dosyayı kaybederseniz adres kalıcı olarak silinir, çünkü onu yeniden oluşturabilecek bir yetkili makam yoktur. Dosyayı dikkatsiz bir yere kopyalarsanız, kopyaya sahip olan herkes onion servisinizi çalıştırabilir.

tor, diğer kullanıcıların okuyabileceği bir dizini kullanmayı reddeder. Başka bir şeyi kontrol etmeden önce izin modunu ve sahibini kontrol edin:

sudo ls -ld /var/lib/tor/onion_site
sudo -u debian-tor cat /var/lib/tor/onion_site/hostname

Listeleme, Debian ve Ubuntu üzerinde debian-tor sahibi ve grubuyla drwx------ değerini göstermelidir. Eğer izinler daha genişse, tor Permissions on directory /var/lib/tor/onion_site/ are too permissive. gibi bir satırı günlüğe yazar ve servis başlamaz. Durumu sudo chown -R debian-tor:debian-tor /var/lib/tor/onion_site ve ardından sudo chmod 700 /var/lib/tor/onion_site ile onarın, sudo systemctl restart tor ile yeniden başlatın ve sonucu sudo journalctl -u tor@default -n 30 ile okuyun.

Bu dizini, özel bir anahtarı yedeklediğiniz yöntemle yedekleyin: sunucunun dışında ve şifreli olarak. Asla sitenizi barındıran depoya (repository) işlemeyin. Eğer aynı sunucunun Tor üzerinden yönetimsel erişime de ihtiyacı varsa, bir onion servisi üzerinden SSH'a erişmek, yönetim yolunu herkese açık site üzerinde ifşa etmekten daha temiz bir ayrım sağlar.

Analitik ve üçüncü taraf varlıklar başlıktan daha fazla veri sızdırır

Bu kısım en önemli noktadır ve Onion-Location ile hiçbir ilgisi yoktur. Sayfanızın referans verdiği her üçüncü taraf varlık, ziyaretçinin tarayıcısının onion ağından çıkıp bir çıkış düğümü (exit node) üzerinden clearnet'e (açık internet) yaptığı bir istektir. Genel bir CDN'den alınan bir yazı tipi, barındırılan bir analitik betiği, gömülü bir video oynatıcı veya yorum eklentisi; bunların her biri, üçüncü tarafa birinin sayfanızı yüklediğini ve okuyucunun bu oturumu kasten Tor üzerinden yönlendirdiğini bildirir.

Bunun iki sonucu vardır. Üçüncü taraf ziyaretten haberdar olur. Ayrıca clearnet kopyanız aynı varlıkları aynı sağlayıcılardan yüklediği için, her iki tarafı da görebilen herkes iki mülkü hiçbir çaba harcamadan ilişkilendirebilir.

Her şeyi aynı kaynaktan sunun. Yazı tiplerinizi kendiniz barındırın. Barındırılan analitik etiketini kaldırın veya bir VPS üzerinde kendi kendine barındırılan analitik ile isteği onion içinde tutacak şekilde kendi sunucunuza taşıyın. Tor Browser'ın varsayılan ayarlarının, herhangi bir analitik aracının toplamaya çalıştığı verilerin çoğunu engelleyeceğini veya etkisiz hale getireceğini unutmayın; bu beklenen ve doğru sonuçtur. Bir sayfa üçüncü taraf bir betik olmadan çalışamıyorsa, o sayfayı onion üzerinde yayınlamayın.

Bir sayfanın gerçekte neleri çektiğini listeleyin:

curl -s --socks5-hostname 127.0.0.1:9050 http://<your-onion-address>.onion/ \
  | grep -oE '(src|href)="https?://[^"]+"' | sort -u

Bu komutun yazdırdığı her satır, sayfanızın tarayıcıdan getirmesini istediği mutlak bir URL'dir. Kendi onion adresiniz olmayan her şey, okuyucularınızdan sizin adınıza yapmalarını istediğiniz bir dışa dönük clearnet isteğidir.

Tehdit modeli, açıkça ifade edildiği haliyle

Onion-Location, bir onion servisinin bulunmasını kolaylaştırır; yaptığı tek şey budur. Operatör olarak sizi anonimleştirmez, çünkü clearnet alan adınız hala kayıt kuruluşu kayıtlarını, DNS kayıtlarını, Certificate Transparency günlüklerinde yayınlanmış bir sertifikayı ve arkasında fatura bilgilerinizin bulunduğu bir VPS hesabını taşır. Onion adresini de anonimleştirmez, çünkü o clearnet alan adından, iki adresin aynı site olduğuna dair kalıcı ve herkese açık bir beyan yayınlamış olursunuz. Avantaj okuyucuya yöneliktir: Tor üzerinden gelen bir kullanıcı, yol üzerinde bir çıkış düğümü (exit node) olmadan ve alan adınız için DNS sorgusu yapmadan Tor içinde kalabilir. Eğer hedefiniz kimsenin bağlanamayacağı bir onion servisi ise, bu başlığı yayınlamayın ve iki kopyayı aynı makinede çalıştırmayın.

Burada birbiriyle ilişkili iki soru ortaya çıkar ve her ikisinin de kendi yanıtları vardır. Tor ve VPN arasındaki fark, kendi trafiğiniz için ne kullanacağınıza karar vermenizi sağlar; bu, ne yayınlayacağınızdan ayrı bir karardır. Sansürlü bir ağdaki okuyucular clearnet sitesine hiçbir şekilde erişemiyorsa, başlığı asla göremezler; bu noktada köprüler ve takılabilir taşıyıcılar (pluggable transports), bu sayfadaki her şeyden daha fazla önem kazanır.

Kurulumun tamamını bir kez doğrulayın

Aşağıdaki komutları sırasıyla çalıştırın. Her birinin bir çıktısı olacaktır.

  1. curl -sI https://example.com/ | grep -i onion-location komutu başlığı yazdırır.
  2. Aynı komut 404 hatası veren bir URL ile çalıştırıldığında da başlığı yazdırır.
  3. curl -s --socks5-hostname 127.0.0.1:9050 http://<your-onion-address>.onion/ komutu sayfanızı döndürür.
  4. Bu çıktıda clearnet alan adınızı aratmak (grep) hiçbir sonuç döndürmez.
  5. https://example.com üzerindeki Tor Browser, .onion available simgesini gösterir.

1'den 4'e kadar olan adımlar başarılı olur ancak 5. adım başarısız olursa, sorun genellikle başlığın kendisinden ziyade başlığın sunulduğu yerdedir. Tarayıcının önbelleğe alınmış bir yönlendirmeyi değil, gerçekten HTTPS sayfasını yüklediğinden emin olun. Ardından, açtığınız tam URL üzerinde curl -sI komutunu çalıştırın; çünkü o belirli yol üzerindeki bir location bloğu, sunucu düzeyindeki yönergeyi devre dışı bırakıyor olabilir.

FAQ

Tor Browser neden ".onion available" bildirimini göstermiyor?

Öncelikle belgelenmiş üç gereksinimi kontrol edin. Değer, http: veya https: şemasına ve .onion ana bilgisayarına sahip tam bir URL olmalıdır; bu nedenle şeması olmayan yalın bir adres başarısız olur ve herhangi bir hata mesajı vermez. Sayfa HTTPS üzerinden sunulmalıdır, bu yüzden 80 numaralı port yönlendirme bloğunuzda ayarlanan bir başlık asla okunmaz. Ayrıca sayfanın kendisi bir onion adresi olmamalıdır. Bundan sonra Nginx'i inceleyin: eşleşen location bloğu içindeki herhangi bir add_header, sunucu seviyesindeki tüm add_header değerlerini geçersiz kılar ve always bayrağı olmadan başlık, 404 ve 500 yanıtlarında yer almaz. Tarayıcıda yüklediğiniz tam URL üzerinde curl -sI komutunu çalıştırın ve başlığın ağ trafiğinde gerçekten mevcut olduğunu doğrulayın.

Onion sitem için TLS sertifikasına ihtiyacım var mı?

Hayır. Bir v3 onion adresi, servisin genel anahtarından türetilir; bu nedenle devre, o belirli servise göre doğrulanır ve herhangi bir HTTP isteği gönderilmeden önce uçtan uca şifrelenir. Onion servisi içinde düz HTTP kullanmak standart yapılandırmadır. Kaçınmanız gereken şey, clearnet sertifikanızı onion üzerinde sunmaktır. Sertifikanızdaki "subject alternative names" alanı alan adınızı listeler; bu durum tarayıcıda isim uyuşmazlığı uyarısını tetikler ve her ziyaretçiye iki sitenin aynı makinede çalıştığını doğrular.

Onion-Location yayınlamak sitemi anonim hale getirir mi?

Hayır. Başlık, clearnet alan adınızdan belirli bir onion adresinin size ait olduğuna dair yapılan herkese açık bir beyandır ve herkes bunu sorgulayabilir. Sağlanan fayda, onion adresine geçiş yaparak çıkış düğümünü ve DNS sorgusunu yolundan kaldıran okuyucuya aittir. Operatör olarak siz hiçbir anonimlik kazanmazsınız ve iki adresi kalıcı olarak birbirine bağlamış olursunuz. Size izlenebilir olmaması gereken bir onion servisi, clearnet sitesiyle hiçbir ortak noktası olmayan başka bir donanım üzerinde yayınlanmalıdır.

HTTP başlığı yerine meta etiketini kullanabilir miyim?

Evet, yanıt başlıklarını ayarlayamadığınız durumlarda (statik bir sunucuda olduğu gibi) kullanabilirsiniz. Belge başlığına <meta http-equiv="onion-location" content="http://youraddress.onion" /> ekleyin. Aynı üç gereksinim burada da geçerlidir; yani sayfa HTTPS olmalı ve bir onion adresi olmamalıdır. Aradaki tek gerçek fark, etiketin yol bilgisi içermeyen sabit bir adres tutmasıdır; oysa Nginx başlığı, $request_uri ekleyerek ziyaretçiyi ana sayfa yerine onion üzerindeki aynı sayfaya yönlendirebilir.