<-
Apache > HTTP Server > Documentation > Version 2.0 > How-To / Tutorials

Apache Tutorial: Introduction to Server Side Includes

SSI, mevcut HTML dokümanlarına dinamik içerik katmak için yöntemler sağlar..

top

Giriş

Bu makalenin konusu Server Side Includes, ya da daha çok bilinen adıyla SSI'dır. Makalemde, sunucunuzu SSI'a izin verecek şekilde ayarlama konusuna değineceğim ve HTML sayfalarına dinamik içerik katmakla ilgili bazı temel SSI tekniklerini anlatacağım.

Makalemin sonunda ise SSI  ile yapılabilecek daha ileri düzey konulardan, örneğin SSI direktiflerinde şarta bağlı ifadeler (conditional statements) kullanmaktan bahsedeceğim.

top

SSI nedir?

SSI, HTML sayfalarına koyulan ve sayfalar *sunulurken(served)* sunucu üzerinde değerlendirilen direktiflerdir. Bütün bir sayfayı CGI programı ya da başka bir dinamik içerik teknolojisi kullanmaya gerek kalmadan, mevcut HTML sayfada dinamik olarak yaratılmış içerik oluşturulmasına olanak tanır.

SSI kullanmak veya sayfanın tamamıyla başka bir program tarafından yaratılmasına karar vermede genellikle sayfanın ne kadar statik olduğu ve her *sunulduğunda* ne kadar hesaplama yapıldığı belirleyici olur. SSI, örneğin o andaki saat bilgisi gibi küçük bilgilerin eklenmesinde çok iyi bir yoldur; ancak sayfanızın büyük bir çoğunluğu *sunulduğu* anda yeniden yaratılmaktaysa başka bir çözüm aramalısınız.


top

Sunucunuzu SSI'a izin verecek biçimde ayarlamak

Sunucunuzda SSI'a izin vermek için, httpd.conf veya .htaccess dosyanızda şu direktif bulunmalıdır:

Options +Includes

Bu, Apache' ye dosyalar içindeki SSI direktiflerin işlenmesine izin vermesini söyler. Birçok yapılandırmanın çoklu Options direktifleri içerdiğine ve bunların birbirini geçersiz kılabileceğine dikkat edin. Muhtemelen, Options direktifini SSI' ın etkin olmasını isteyeceğiniz belli bir dizine uygulayacaksınız; bu şekilde en son işletilmesini güvence altına almış olacaksınız. Bu sayede, yukarıdan gelen diğer direktifler tarafından geçersiz kılınması engellenmiş olacaktır.

Her dosya, SSI direktifleri için işlenmez; Apache' ye hangi dosyaların işleneceğini bildirmelisiniz. Bunu yapmanın 2 yolu vardır. Aşağıdaki direktiflerle, belli bir uzantıya, örneğin .shtml uzantısına sahip dosyaların işlenmesini sağlayabilirsiniz;

AddType text/html .shtml
AddOutputFilter INCLUDES .shtml

Bu yaklaşımın bir dezavantajı, mevcut bir dosyaya SSI direktifleri eklemek istediğinizde sayfanın adını ve dolayısıyla bu sayfaya yapılmış olan tüm bağlantıları değiştimek zorunda olmanızdır.

Diğer bir yol, XBitHack direktifini kullanmaktır:

XBitHack on

XBitHack, Apache'ye "execute" biti set edilmiş dosyalardaki SSI direktiflerinin işletilmesini söyler. Böylece, dosya adını değiştirmeksizin sadece dosyayı executable (çalıştırılabilir) hale getirerek SSI direktiflerini işlettirmek mümkün olur. Dosyayı çalıştırılabilir hale getirmek içinse chmod komutunu kullanmalısınız.

chmod +x pagename.html

<>Birçok kullanıcı, XBitHack konusunu bilmediğinden ötürü Apache' yi tüm .html dosyalarını SSI için işleyecek biçimde ayarlamanızı tavsiye eder. Bu iyi bir fikir değildir; çünkü içinde SSI direktifi içermeyen birçok dosya boşu boşuna işlenecek ve bu da ciddi bir performans kaybına yol açacaktır.

Windows işletim sistemlerinde execute biti bulunmadığından ötürü, XBitHack işe yaramayacaktır.

<>Öntanımlı ayarlarla Apache son değiştirilme tarihini veya HTTP başlıklarının (header) içerik uzunluğunu SSI sayfalara yollamaz; bunun sebebi dinamik bir içerikte bu değerlerinin hesaplanmasının zor olmasıdır. Bu sebeple dokümanınız cache' e alınmayarak beklenenden daha yavaş bir istemci (client) performansına neden olabilir. Bu sorunun iki çözümü bulunmaktadır:

  1. XBitHack Full yapılandırmasını kullanın. Bu, Apache' ye diğer bağlı dosyalar yerine sadece istenen dosyanın son değiştirilme tarihini bulmasını söyler.
  2.  mod_expires 'ın sağladığı direktiflerle bir "expiration date" belirleyin; böylece tarayıcı ve proxy' ler bunları cache' de tutmayı geçerli sayar.
top

Temel SSI direktifleri

SSI direktifleri aşağıdaki formattadır:

<!--#eleman özellik=değer özellik=değer ... -->

Bu format, HTML dosyalarında kullanılan açıklama formatı gibi olduğundan, eğer SSI aktif değilse tarayıcılar bu satırı görüntülemeyecek, ancak kaynak dosyasında görünecektir. Eğer SSI doğru şekilde çalışıyorsa, direktif sonuçlarla değiştirilerek tarayıcıda görüntülenir. Böylece SSI' ın çalışmaması durumunda ekranda bu ifadelerin görüntülenerek karmaşa yaratmasının önüne geçilir.

"Eleman" birçok şey olabilir; bunlara daha sonra değineceğiz. Şimdilik, SSI ile neler yapabileceğinizle ilgili örnekler vereceğiz
.

Bugünün tarihi

<!--#echo var="DATE_LOCAL" -->

echo, değişkenin değerini  gösterir (DATE_LOCAL; dikkat ederseniz 'var' ifadesiyle bunun bir değişken olduğu ifade edilmiştir-ç.n) Kendi değişkenlerinizi set ifadesi kullanarak oluşturabilirsiniz; bunun dışında birçok standart değişkende mevcuttur. Bu standart değişkenler, CGI programlarında da kullanabileceğiniz bütün ortam değişkenlerini (environment variables) içermektedir.

Eğer tarihin görüntülenme şeklini beğenmediyseniz, config elemanını timefmt ile kullanarak görüntülenme biçimini değiştirebilirsiniz:

<!--#config timefmt="%A %B %d, %Y" -->
Bugün <!--#echo var="DATE_LOCAL" -->

Dosyanın değiştirilme tarihi

Bu dosya en son şu tarihte değiştirildi: <!--#flastmod file="index.html" -->

timefmt, flastmod ile birlikte kullanılabilir; bu sayede yukarıdaki örnekteki gibi değişik biçimlerde çıktı alabilirsiniz.

CGI programından gelen çıktıyı görüntülemek

 Bu, SSI'ın çok yaygın kullanım biçimlerinden biridir - CGI programının ürettiği sonucu görüntülemek; örneğin meşhur "hit counter"

<!--#include virtual="/cgi-bin/counter.pl" -->

top

İlave örnekler

Aşağıda, HTML dokümanlarınızda SSI ile yapabileceğiniz bazı işlemlerle ilgili örnekler bulunmaktadır.

Bu doküman ne zaman değiştirildi?

Daha önce SSI' ın kullanıcıyı dokümanın en son ne zaman değiştirildiği konusunda bilgilendirebildiğinden bahsetmiştik. Ancak bunun gerçekte nasıl olduğu soru işareti olarak kalmıştı. Aşağıdaki kod HTML dökümanına yerleştirildiğinde sayfanızda bu dokümanın son değiştirilme tarihi görüntülenir.

<!--#config timefmt="%A %B %d, %Y" -->
Bu dosyanın son değiştirilme tarihi: <!--#flastmod file="ssi.shtml" -->

Burada ssi.html dosyasının adını kendi kullandığınız dosya ile değiştirmelisiniz. Eğer çağrılan dosyanın tarih bilgisini direk olarak göstermek istiyorsanız, LAST_MODIFIED değişkenini kullanmalısınız; bu kullanımda LAST_MODIFIED değişkeninin içinde yeraldığı dosyanın son değiştirilme tarihi görüntülenir:

<!--#config timefmt="%D" -->
Bu dosyanın son değiştirilme tarihi: <!--#echo var="LAST_MODIFIED" -->

timefmt ile daha detaylı bilgi için bir arama motorunda strftime ifadesini aratarak detaylı bilgi bulabilirsiniz; kullanım biçimleri tamamen aynıdır.

Standart başlık eklemek

Birkaç sayfadan fazla içeriğe sahip herhangi bir siteniz varsa bu sayfaların hepsinde değişiklik yapmanın ne kadar başbelası olduğunu olduğunu farketmişsinizdir. Özellikle de sayfaların hepsi birbiri gibi görünmek zorundaysa..

Tüm sayfaların bir başlık ve/veya dipnot dosyası içermesini sağlayarak bu işi çok basitleştirebilirsiniz. Tek yapmanız gereken bir başlık dosyası hazırlayıp sonra bunu SSI' ın include komutu ile her sayfaya bağlamaktır. include ile hangi sayfaların bu dosyayı içereceğini, file veya virtual özelliğini kullanarak belirtebilirsiniz. file özelliği, bulunulan dizine göreli olarak dosya yolunu belirtir. Bu / ile başlayan bir yol olamaz, hatta yol tanımı içinde / içeremez. Muhtemelen virtual'ı daha kullanışlı bulacaksınız; virtual ile aynı sunucu üzerinde olmak şartıyla dilediğiniz gibi dosya yolunu belirtebiliriniz.

<!--#include virtual="/footer.html" -->

virtual ve relative bir arada kullanılabilir; SSI direktifleri de her iki dosyada yeralabilir.

top

Başka neleri yapılandırabilirim?

Zaman formatından başka, yapılandırabileceğiniz iki şey daha vardır:

Genellikle, SSI direktifinizle ilgili birşeyler yanlış gittinde aşağıdaki mesajı alırsınız:

[an error occurred while processing this directive]

Eğer bu mesajı değiştirmek istiyorsanız, config elemanıyla beraber errmsg özelliğini kullanmalısınız:

<!--#config errmsg="[Görünüşe bakılırsa SSI'ın nasıl kullanıldığını bilmiyorsunuz!]" -->

Ayrıca dosya büyüklüklerinin hangi birimle ifade edileceğini sizefmt özelliğiyle belirleyebilirsiniz: bytes tam uzunluğu, -tabi byte cinsinden!- abbrev ise Kb ya da Mb cinsinden yuvarlanmış rakamı gösterir (hangisi uygunsa)

top

Komut çalıştırmak

SSI kullanarak shell altında (eğer linux kullanıyorsanız bash, Windows kullanıyorsanız DOS veya NT tabanlı sistemler için komut istemi) exec direktifi ile komut çalıştırabilirsiniz. Aşağıdaki örnek, Linux ile çalışan bir sunucuda dizin içeriğini listeler (ls komutu DOS ve Windows' ta dir komutuna karşılık gelir)

<pre>
<!--#exec cmd="ls" -->
</pre>

Windows tabanlı sistemler içinse;

<pre>
<!--#exec cmd="dir" -->
</pre>

Windows tabanlı sistemlerde çıktı biraz garip düzenlenmiş gösterilebilir; bunun sebebiyse dir komutundan gelen çıktının tarayıcıların "kafasını karıştıran" <dir> dizesini içermesidir.

exec direktifinin kullanımı, özellikle kullanıcılar web sayfalarını değiştirebiliyorsa tehlikelidir; çünkü web sunucusu üzerinde komut çalıştırmaya olanak tanır. Bu sebeple muhtemelen exec direktifinin kullanımını sınırlamak isteyeceksiniz. SSI' ı aktif hale getirip exec direktiflerinin işlenmesini önlemek mümkündür. Bunun için, Options direktifini IncludesNOEXEC argümanıyla kullanmalısınız.

top

İleri düzey SSI teknikleri

İçeriği görüntülemek dışında SSI bize değişken tanımlama ve bu değişkenleri kullanarak koşullu ifadeler oluşturma, kıyaslama yapabilme imkanı tanımaktadır.

Uyarı

Bu makalede verilen örneklerin birçoğu Apache 1.2 veya daha üst sürümlerde çalışır. Üst sürümlere terfi etmeniz kesinlikle tavsiye edilir.

Değişkenlere değer atamak

set direktifi ile daha sonra kullanmak üzere değişkenler oluşturabilirsiniz. Kullanım biçimi şöyledir:

<!--#set var="değişken ismi" value="değer" -->

Bu şekilde değişkenlere değer atamak yerine, değişkenlerinizin çevresel değişkenlerden veya LAST_MODIFIED gibi değişkenlerden değer almasını sağlayabilirsiniz.  Bunu yapmak içinse, değer(value) yerine bir ifade yazmak yerine, başına $ işareti koyulmuş bir değişken yazacağız.

<!--#set var="degistirilme_tarihi" value="$LAST_MODIFIED" -->

Eğer değişkene atayacağımız değerde dolar işareti varsa, bu işaretten önce ters slash işareti kullanmalıyız:

<!--#set var="fiyat" value="\$100" -->

Son olarak, eğer değişkene atadığımız değeri uzun bir satır içinde kullanacaksak ve bunların birbirileriyle karıştırılabilmesi sözkonu ise, parantezlerle birbirlerinden ayırabiliriz:

<!--#set var="tarih" value="${DATE_LOCAL}_${DATE_GMT}" -->

Koşullu ifadeler

Değişkenlere değer atama ve değerlerini karşılaştırmayı artık bildiğimize göre, artık koşullu ifadeler oluşturabiliriz. Bu sayede SSI küçük bir programlama dili gibi kullanılabilir. mod_include , koşullu ifadeler oluşturabilmemiz için if, elif, else, endif yapılarını sağlar. Bu sayede tek bir sayfadan etkili biçimde birçok mantıksal sayfa üretebiliriz.

Bu yapıları aşağıdaki gibi kullanabiliriz:

<!--#if expr="test_koşulu" -->
<!--#elif expr="test_koşulu" -->
<!--#else -->
<!--#endif -->

Test koşulu herhangi bir mantıksal kıyaslama olabilir- değerleri birbirleriyle kıyaslamak ya da bir değerin "doğruluğunu" kıyaslamak gibi.Kıyaslama operatörlerinin tam listesini  mod_include dokümanında bulabilirsiniz. Bu yapıyla ilgili biraz örnek verelim:

Yapılandırma dosyanıza aşağıdaki satırları koyabilirsiniz:

BrowserMatchNoCase macintosh Mac
BrowserMatchNoCase MSIE InternetExplorer

Bu örnek,kullanıcı Macintosh ve Internet Explorer kullanıyorsa, "Mac" ve "InternetExplorere" çevresel değişkenlerine "true" değeri atar.

SSI içeren bir web sayfasında şunu da yapabilirsiniz;

<!--#if expr="${Mac} && ${InternetExplorer}" -->
özür dileyen bir yazı
<!--#else -->
havalı bir JavaScript
!--#endif -->

Bu örnekte, Macintosh bir bilgisayarda Internet Explorer kullanılıyorsa, kullanıcı bir özür yazısıyla karşılaşır; eğer bu iki koşul aynı anda gerçekleşmezse (değeri 'true' değilse) ikinci kısımda yeralan JavaScript kodu çalıştırılır.

Koşullu ifadelerde kendi tanımladığınız değişkenleri ya da çevresel değişkenleri kullanabilirsiniz. SetEnvIf direktifiyle çevresel değişkenleri tanımlayarak ve buna benzer diğer direktifleri kullanarak, Apache ile CGI' a bile gerek duymaksızın oldukça tatminkar dinamik içerik yaratmanız mümkündür.

top

Sonuç

SSI, kesinlikle CGI ya da diğer dinamik web sayfası yaratan teknolojilerin yerine geçemez. Öte yandan, fazladan birçok iş yapmaya gerek kalmaksızın, mevcut sayfalara küçük çaplı dinamik içerik eklemek için çok iyi bir yoldur.