Apache HTTP Sunucusu Sürüm 2.4

Apache HTTPD, içerik uzlaşımını HTTP/1.1 belirtiminde bahsedildiği şekliyle destekler. Bir özkaynağın en iyi gösterimini, tarayıcının sağladığı karakter kodlaması, karakter kümesi, dil, ortam türü gibi kullanıcı tercihlerine bağlı olarak seçebilir. Ayrıca, tarayıcının kullanıcı tercihlerini tam yansıtamadığı durumlarda istekleri daha akıllıca ele alabilmeyi sağlayacak bir takım özelliklere de sahiptir.
İçerik uzlaşımı öntanımlı olarak derlenen
      mod_negotiation modülü tarafından sağlanır.

 İçerik Uzlaşımı Hakkında
 İçerik Uzlaşımı Hakkında httpd’de İçerik Uzlaşımı
 httpd’de İçerik Uzlaşımı Uzlaşım Yöntemleri
 Uzlaşım Yöntemleri Üstünlük Değerleriyle Oynamak
 Üstünlük Değerleriyle Oynamak Şeffaf İçerik Uzlaşımının Genişletilmesi
 Şeffaf İçerik Uzlaşımının Genişletilmesi Hiperbağlar ve İsimlendirme Uzlaşımları
 Hiperbağlar ve İsimlendirme Uzlaşımları Arabellekler Hakkında
 Arabellekler HakkındaBir özkaynağın bir çok farklı gösterimi olabilir. Örneğin, bir belgenin farklı ortam türleri ve/veya farklı diller için gösterimleri olabilir. En uygun seçimi yapmanın tek yolu kullanıcıya bir liste verip seçmesini istemektir. Bununla birlikte sunucunun bu seçimi kendiliğinden yapması da mümkündür. Tarayıcılar isteğin bir parçası olarak kullanıcı tercihlerini de gönderdiğinden bu istendiği gibi çalışır. Örneğin bir tarayıcı, kullanıcısınının mümkünse Fransızca içerik tercih ettiğini yoksa İngilizce içeriğe de razı olabileceğini belirtebilirdi. Tarayıcılar bu tercihleri başlıkta belirtirler. Tarayıcı sadece Türkçe içerik istendiğini şöyle belirtebilirdi:
Accept-Language: tr
Bu tercihin yerine getirilebilmesininin sadece, desteklenen diller arasında bu dilin varlığına ve istenen belgenin bu dilde bir gösteriminin bulunmasına bağlı oluşuna dikkat ediniz.
Daha karmaşık bir istek örneği olarak, tarayıcının Fransızca ve İngilizce içerik kabul etmeye ayarlandığını fakat Fransızcayı tercih ettiğini ve çeşitli ortam türlerini kabul etmekle birlikte salt metin ve diğer metin türlerinden ziyade HTML tercih ettiğini, ayrıca, diğer ortam türleri üzerinde GIF veya JPEG tercih ettiğini fakat başka çare yoksa her ortam türüne de izin verdiğini belirtiyor olsun:
      Accept-Language: fr; q=1.0, en; q=0.5
      Accept: text/html; q=1.0, text/*; q=0.8, image/gif; q=0.6, image/jpeg;
      q=0.6, image/*; q=0.5, */*; q=0.1
    
httpd, HTTP/1.1 belirtiminde tanımlanan şekliyle ‘sunucu yönetiminde’
      içerik uzlaşımını destekler. Accept,
      Accept-Language, Accept-Charset ve
      Accept-Encoding istek başlıklarını tamamen destekler.
      httpd ayrıca, RFC 2295 ve RFC 2296’da tanımlanan bir deneysel uzlaşım
      olarak ‘şeffaf’ içerik uzlaşımını da destekler. Fakat ‘özellik
      uzlaşımını’ bu RFC’lerde tanımlandığı gibi desteklemez.
Bir özkaynak bir URI (RFC 2396) tarafından betimlenen kavramsal bir öğedir. Apache gibi bir HTTP sunucusu, ortam türü, karakter kümesi, kodlama ve saire ile tanımlanmış bir bayt dizisi şeklindeki her gösterimiyle, özkaynaklara kendi isim alanları dahilinde erişim sağlar. Her özkaynağın aynı anda bir veya daha fazla gösterimi mevcut olabileceği gibi hiç mevcut olmayabilir de. Eğer çok sayıda gösterim mevcutsa, bu özkaynağın uzlaşılabilir olduğundan ve her gösteriminin bir çeşitlilik oluşturduğundan bunun da uzlaşımın boyutlarından kaynaklandığından bahsedilebilir.
Bir özkaynak üzerinde uzlaşılırken gösterim çeşitlerinin her biri hakkında sunucuya bilgi verilmesi gerekir. Bu iki yolla yapılabilir:
*.var dosyası
        gibi).Bir türeşlem dosyası, type-map eylemcisi ile ilişkili bir
      belgedir (ya da eski httpd yapılandırmaları ile geriye uyumluluk için,
      application/x-type-map MIME türünde
      bir belgedir). Bu özelliği kullanmak için, yapılandırmada bir tür
      eşleyici olarak her dosya ismi uzantısı için bir type-map
      eylemcisi tanımlamalısınız. Bu, sunucu yapılandırma dosyasında en iyi
      şöyle yapılabilir:
AddHandler type-map .var
Türeşlem dosyaları kendilerini tanımlayan özkaynak ile aynı isimde
      olmalı ve isim bir .var uzantısı içermelidir. Aşağıdaki
      örneklerde özkaynak ismi foo olduğundan türeşlem dosyasının
      ismi foo.var'dır.
Bu dosya her gösterim çeşidi için bir girdi içermelidir; bu girdiler ardarda belirtilen HTTP biçem başlık satırlarından oluşur. Farklı gösterimlerin girdileri bir boş satırla diğerlerinden ayrılır. Aynı girdi içinde boş satır kullanılamaz. Bir eşlem dosyasını bir birleşik öğenin tamamı için bir girdi ile başlatmak adet olmuştur (ise de, bu gerekli değildir, hele yoksayılacaksa hiç gerekli değildir). Eşlem dosyası için aşağıda bir örnek verilmiştir.
Bu dosyadaki URI'ler türeşlem dosyasının yerine görelidir. Dolayısıyla, bu dosyaların aynı dizinde bulunması beklenirse de bu gerekli değildir. Aynı sunucuda bulunan tüm dosyalar için türeşlem dosyasındaki gibi mutlak veya göreli URI'ler belirtebilirsiniz.
      URI: misal
    
      URI: misal.en.html
      Content-type: text/html
      Content-language: en
    
      URI: misal.fr.de.html
      Content-type: text/html;charset=iso-8859-2
      Content-language: fr, de
    
Ayrıca, MultiViews etkin olsa bile bir türeşlem dosyasının
      dosya ismi uzantılarının taranmasına göre öncelik alacağına dikkat
      ediniz. Eğer gösterimler bu örnekteki resim dosyasında olduğu gibi
      farklı kaynak üstünlüklerine sahipseler, ortam türünün qs
      parametresi kullanılarak kaynak üstünlükleri belirtilebilir: 
      URI: misal
    
      URI: misal.jpeg
      Content-type: image/jpeg; qs=0.8
    
      URI: misal.gif
      Content-type: image/gif; qs=0.5
    
      URI: misal.txt
      Content-type: text/plain; qs=0.01
    
qs değerleri 0.000-1.000 değer aralığı içinde
      belirtilebilir. 0.000 qs değerine sahip gösterimin asla
      seçilmeyeceğine dikkat ediniz. Bir qs değeri belirtilmeyen
      gösterimlerin kaynak üstünlüğü 1.000 kabul edilir. qs
      parametresinin belirttiği değer istemcinin yeteneklerinden bağımsız
      olarak olası gösterimler arasında göreli bir üstünlük ifade eder.
      Örneğin bir fotoğraf sözkonusu olduğunda bir JPEG dosyasının kaynak
      üstünlüğü bir ASCII çiziminkinden yüksek olacaktır. Diğer taraftan özgün
      resim bir ASCII çizim olduğu takdirde, ASCII çizim, bir JPEG gösterimine
      göre öncelikli olacaktır. Bu nedenle qs değeri özkaynağın
      doğasına bakarak belirlenir.
Tanınan başlıkların tam listesini mod_negotiation modülünün belgesinde bulabilirsiniz.
MultiViews, apache2.conf dosyasındaki veya
      (AllowOverride yönergesinin
      değerine bağlı olarak) .htaccess dosyalarındaki <Directory>, <Location> veya <Files> bölümleri içinde
      Options yönergeleri ile
      belirtilebilen, dizine özgü bir seçenektir. Yalnız, dikkatli olun,
      Options All yaparak MultiViews seçeneğini
      etkin kılamazsınız; seçeneği ismiyle açıkça belirtmelisiniz.
MultiViews şöyle etki eder: Sunucudan,
      MultiViews seçeneğinin etkin olduğu /bir/dizin
      dizininden filanca dosyası için bir istekte bulunulmuşsa
      fakat dizinde bu dosya yoksa, sunucu dizin içeriğini
      filanca.* dosyaları için tarar ve bu dosyalar için
      istemcinin ismiyle talep ettiği ortam türlerini ve kodlamaları
      kullanarak bir türeşlem dosyası uydurup bu gösterimler arasından
      istemcinin gereksinimlerine en uygun gösterimi seçer.
MultiViews ayrıca, sunucunun bir dizin içeriğini
      listelemeye çalıştığı durumda DirectoryIndex yönergesi ile belirtilen dosya için de bir
      arama tertipleyebilir. Eğer yapılandırma dosyalarında
DirectoryIndex index
şeklinde bir atama varsa ve dizinde index.html ve
      index.html3 dosyaları varsa sunucu bunlar arasından hakem
      sıfatıyla bir seçim yapacaktır; ama bu ikisi yerine dizinde sadece
      index.cgi mevcutsa sunucu sadece bu dosyayı
      çalıştıracaktır.
Okunan dizinde bulunan dosyalar arasında mod_mime
      tarafından tanınan karakter kümesi, içerik türü, dil ve kodlama
      başlıklarına uygun gösterim uzantılarından birine sahip bir dosya yoksa
      sonuç MultiViewsMatch
      yönergesiyle yapılan tanıma bağlı olur. Bu yönerge hangi diğer dosya
      uzantılarının, eylemcilerin veya süzgeçlerin çok gösterimli uzlaşımla
      ilintileneceğini belirler.
httpd’nin, bir türeşlem dosyası veya dizin içindeki bir dosya sayesinde belli bir özkaynağın gösterim çeşitlerinin bir listesini elde ettikten sonra ‘en uygun’ gösterime karar vermek için kullanabileceği iki yöntem vardır. httpd’nin içerik uzlaşım özelliklerinin kullanımı sırasında uzlaşımın nasıl yerine getirileceği ile ilgili ayrıntıları bilmek aslında gerekli değildir. Bununla birlikte belgenin kalanında bu konu açıklanmaya çalışılmıştır.
İki uzlaşım yöntemi vardır:
| Boyut | Açıklama | 
|---|---|
| Ortam Türü | Tarayıcı ortam türü tercihlerini Acceptbaşlık alanı
          ile belirtir. Her öğenin kendine özgü bir üstünlük katsayısı
          olabilir. Gösterimin açıklaması da ayrıca bir kaynak üstünlüğüne
          (qsparametresi) sahip olabilir. | 
| Dil | Tarayıcı dil tercihlerini Accept-Languagebaşlık
          alanı ile belirtir. Her öğenin kendine özgü bir üstünlük katsayısı
          olabilir. Gösterimler bir kaç dilde olabileceği gibi hiç bir dille
          ilişkilendirimemiş de olabilir. | 
| Kodlama | Tarayıcı kodlama tercihlerini Accept-Encodingbaşlık
          alanı ile belirtir. Her öğenin kendine özgü bir üstünlük katsayısı
          olabilir. | 
| Karakter Kümesi | Tarayıcı karakter kümesi tercihlerini Accept-Charsetbaşlık alanı ile belirtir. Her öğenin kendine özgü bir üstünlük
          katsayısı olabilir. Gösterim çeşitleri karakter kümesini ortam
          türünün bir parametresi olarak belirtebilirler. | 
httpd, tarayıcıya döndürülecek en uygun gösterim çeşidini (varsa) seçmek için aşağıdaki algoritmayı kullanabilir. Bu algoritma pek de yapılandırılabilir değildir. Şöyle çalışır:
Accept başlığındaki üstünlük katsayısı ile
            gösterimin ortam türünde belirtilen kaynak üstünlüğünün çarpımı en
            büyük olan gösterim çeşidi seçilir.Accept-Language başlığındaki dil
            sıralamasına bakılır, aksi takdirde LanguagePriority
            yönergesi ile atanmışsa oradaki dil sıralamasına bakılır.Accept-Charset başlık satırında belirtilene bakarak
            en uygun karakter kümesine sahip gösterim çeşitleri seçilir.
            Alenen dışlanmadıkça ISO-8859-1 kabul edilebilir karakter
            kümesidir. text/* ortam türüne sahip gösterim
            çeşitlerinden belli bir karakter kümesi ile ilişkilendirilmemiş
            olanların karakter kümesinin ISO-8859-1 olduğu varsayılır.Vary’ye uzlaşım boyutları atanır (tarayıcı ve
        arabellekler özkaynağı kaydederken bu bilgiyi kullanırlar)
        ve algoritma sonlandırılır.Vary başlığında gösterim çeşitliliğinin
        boyutları belirtilir.httpd bazen yukarıdaki httpd uzlaşım algoritmasının kesin sonucunun
      beklenenden farklı olması için üstünlük değerleriyle oynar. Bunu tam ve
      doğru bilgi göndermeyen tarayıcılar için algoritmadan en iyi sonucu elde
      etmek amacıyla yapar. Bazen günümüzün en tanınmış tarayıcıları bile çoğu
      durumda yanlış bir seçimle sonuçlanmayacaksa Accept başlık
      bilgilerini göndermemektedir. Eğer tarayıcı eksiksiz ve doğru bilgi
      gönderirse httpd bu değerlerle oynamayacaktır.
Accept: istek başlığı ortam türü tercihlerini yansıtır.
      Ayrıca, * bir dizge ile eşleşmek üzere "image/*" veya  "*/*" gibi ortam
      türü kalıpları da içerebilir. Dolayısıyla şöyle bir istek,
Accept: image/*, */*
diğer türler gibi "image/" ile başlayan ortam türlerini kabul edilebilir kılacaktır. Bazı tarayıcılar ortam türlerini örtük olarak elde etmek amacıyla hep bu tür kalıplar gönderirler. Örnek:
      Accept: text/html, text/plain, image/gif, image/jpeg, */*
    
Bunun amacı, açıkça listelenmiş türlerin tercih edildiğini, fakat farklı gösterimler varsa onların da kabul edilebileceğini belirtmektir. Üstünlük değerlerini doğrudan kullanarak tarayıcılar gerçekte ne istediklerini şuna benzer şekilde belirtebilirler:
      Accept: text/html, text/plain, image/gif, image/jpeg, */*; q=0.01
    
Açıkça belirtilen türler için üstünlük katsayısı belirtilmemiştir, dolayısıyla üstünlük katsayılarının 1.0 (en yüksek) olduğu varsayılmaktadır. */* kalıbı 0.01 gibi çok daha düşük bir öncelik belirtmektedir. Bu bakımdan, ancak, açıkça belirtilen türlerden hiçbirinin bulunmaması halinde diğer türler eşleşecektir.
Eğer Accept: başlığı hiçbir q
      katsayısı içermiyorsa ve başlıkta "*/*" belirtilmişse, httpd istenen
      davranışı taklit etmek için bu kalıba 0.01 katsayısını atar. Keza
      "type/*" kalıbına da 0.02 katsayısını atar (yani, */* kalıbına göre
      tercihli olur). Eğer  Accept: alanındaki her ortam türü bir
      q katsayısı içeriyorsa bu özel değerler uygulanmaz.
      Dolayısıyla gerekli bilgiyi açıkça bildiren tarayıcılardan gelen
      istekler umulduğu gibi işlem görecektir.
httpd 2.0’dan itibaren, uzlaşım algoritmasına, bir eşleşme bulmak konusunda algoritma başarılı olamadığı takdirde hoş bir son çareye izin vermek için bazı istisnalar eklenmiştir.
İstemci sunucudan bir sayfa istediğinde, sunucu, tarayıcı tarafından
      gönderilen Accept-language başlığıyla eşleşen tek bir sayfa
      bulamadığı takdirde istemciye ya “Kabul edilebilir bir gösterim çeşidi
      yok” ya da “Çok sayıda seçim belirtilmiş” yanıtını döndürür. Bu hata
      iletilerinden kaçınmak için bu gibi durumlarda httpd
      Accept-language başlığını yoksaymaya ayarlanabilir. Böylece
      istemcinin isteğine tam olarak uymasa da bir belge sağlanır. Bu hata
      iletilerinin birini veya her ikisini de geçersiz kılmak için ForceLanguagePriority yönergesi
      kullanılabilir ve sunucunun kararını LanguagePriority yönergesine
      dayanarak vermesi sağlanabilir.
Sunucu ayrıca, tam bir eşleşme bulunmadığı zaman lehçelerle de eşleşme
      arayabilir. Örneğin, bir istemci Britanya İngilizcesi
      (en-GB) ile yazılmış belgeler için istekte bulunursa,
      sunucu normalde HTTP/1.1 standardına göre bir belgenin basitçe
      en olarak imlenmesine izin vermez. (Bir okuyucu Britanya
      İngilizcesini anlıyor ama genel İngilizceyi anlamıyor diye
      Accept-Language başlığında en  değil de
      en-GB’yi belirtmesinin hemen hemen daima bir yapılandırma
      hatasına yol açacağına dikkat ediniz. Maalesef, mevcut istemcilerin çoğu
      öntanımlı yapılandırmalarında buna benzer şeyler yapmaktadır.) Bununla
      birlikte, başka bir dille eşleşme mümkün değilse ve sunucu “Kabul
      edilebilir bir gösterim çeşidi yok” hatasını döndürmeye hazırsa veya
      LanguagePriority son
      çaresine ayarlanmışsa alt küme belirtimini yok sayacak ve
      en belge isteklerine en-GB belgelerle yanıt
      verecektir. httpd, lehçenin üyesi olduğu anadili, istemcinin kabul
      edilebilir diller listesine örtük olarak düşük bir üstünlük değeri ile
      ekler. Yalnız şuna dikkat edin, eğer istemci tercihini "en-GB; q=0.9,
      fr; q=0.8" olarak belirtirse ve sunucuda sadece "en" ve "fr" belgeleri
      varsa sunucu "fr" belge ile yanıt verecektir. HTTP/1.1 belirtimi ile
      uyumluluğu sağlamak ve düzgün yapılandırılmış istemcilerle gerektiği
      gibi çalışabilmek için bu gereklidir.
Gelişmiş tekniklerin (çerezler, özel URL yolları gibi) desteklenmesi
      sırasında, kullanıcının tercih ettiği dili saptamak için httpd 2.0.47
      sürümünden beri mod_negotiation modülü
      prefer-language ortam değişkenini
      tanımaktadır. Değişken mevcutsa ve uygun bir dil yaftası içeriyorsa
      mod_negotiation uygun gösterimi seçmeyi deneyecektir.
      Böyle bir gösterim çeşidi mevcut değilse normal uzlaşım işlemi
      uygulanacaktır.
SetEnvIf Cookie "language=(.+)" prefer-language=$1 Header append Vary cookie
httpd, şeffaf içerik uzlaşımı protokolünü (RFC 2295) şöyle genişletir:
    Sadece içerik kodlamasına özgü olmak üzere gösterim çeşidi listelerinde
    gösterim çeşitlerini imlemek için yeni bir {encoding ..}
    elemanı kullanılır. RVSA/1.0 algoritmasının (RFC 2296) gerçeklenimi,
    listedeki kodlanmış gösterim çeşitlerini tanımak ve onları
    Accept-Encoding başlık alanıyla ilgili olarak kabul
    edilebilir kodlamalara aday gösterim çeşitleri olarak kullanmak üzere
    genişletilmiştir. RVSA/1.0 gerçeklenimi, en uygun gösterim çeşidi
    seçiminin öncesinde hesaplanmış üstünlük katsayısını virgülden sonra beş
    haneye yuvarlamaz.
Eğer dil uzlaşımı kullanıyorsanız ve birden fazla dosya ismi uzantısına sahip dosyalarınız varsa uzantıların sıralamasının normalde uygunsuz düştüğü farklı isimlendirme yaklaşımlarında bulunabilirsiniz (ayrıntılar için mod_mime belgesine bakınız).
Bir MIME türü uzantısına sahip bir dosyanın (html gibi),
      kodlanmış bir gösterimi (gz gibi) mevcut olabilir. Bu
      dosyanın ayrıca farklı dillerdeki gösterimleri için de bir uzantısı
      (en gibi) olabilir.
Örnekler:
Hiperbağ olarak geçerli ve geçersiz bazı dosya ismi örnekleri:
| Dosya ismi | Geçerli Hiperbağ | Geçersiz Hiperbağ | 
|---|---|---|
| misal.html.en | misal misal.html | - | 
| misal.en.html | misal | misal.html | 
| misal.html.en.gz | misal misal.html | misal.gz misal.html.gz | 
| misal.en.html.gz | misal | misal.html misal.html.gz misal.gz | 
| misal.gz.html.en | misal misal.gz misal.gz.html | misal.html | 
| misal.html.gz.en | misal misal.html misal.html.gz | misal.gz | 
Yukarıdaki tabloya bakarak hiperbağlarda bir dosya ismini uzantısız
      olarak (misal gibi) kullanmanın daima mümkün olduğunu
      farkedeceksiniz. Böylece bir belgenin asıl türünü gizleyebilir ve
      sonradan bir hiperbağ değişikliği yapmaksızın örneğin
      html’den shtml veya cgi’ye
      geçebilirsiniz.
Hiperbağlarda MIME türlerini (misal.html gibi) kullanmaya
      devam etmek istiyorsanız dil uzantısı MIME türü uzantısının sağında
      kalmalıdır (misal.html.en gibi).
Bir arabellek, bir gösterimi istek URL’si ile ilişkilendirerek saklar. Böylece, sonradan aynı URL için bir istek yapıldığında kaydettiği gösterimi kullanabilir. Fakat özkaynak sunucuyla uzlaşılan türdeyse arabelleğe ilk istenen çeşit saklanmış olacağından isteğe yanlış gösterimle yanıt verilmiş olacaktır. Bunun olmaması için httpd, normal olarak içerik uzlaşımının sonucu olarak döndürülen tüm yanıtları HTTP/1.0 istemciler tarafından arabelleklenemez olarak imler. httpd ayrıca, uzlaşımlı yanıtların arabelleklenmesini mümkün kılan HTTP/1.1 protokolünü de destekler.
HTTP/1.0 uyumlu istemcilerden (bir tarayıcı veya arabellek) gelen
      istekler için, uzlaşıma konu yanıtların arabelleklenmesini mümkün kılmak
      üzere CacheNegotiatedDocs yönergesi kullanılabilir. Bu yönerge
      argümansızdır ve sunucu genelinde veya sanal konakların
      yapılandırılmasında kullanılabilir. Bunun HTTP/1.1 istemcilerinden gelen
      isteklere bir etkisi yoktur.
HTTP/1.1 istemciler için, httpd, yanıtın uzlaşım boyutlarını göstermek
      üzere bir Vary HTTP yanıt başlığı gönderir. Arabellekler bu
      bilgiyi sonraki istekleri yerel kopyadan sunarken kullanabilirler. Bir
      arabelleğin uzlaşım boyutlarına bakmaksızın yerel kopyasını kullanmaya
      teşvik etmek için force-no-vary ortam değişkenini etkin kılabilirsiniz.