Apache HTTP Server Version 2.0

SSI, mevcut HTML dokümanlarına dinamik içerik katmak için yöntemler sağlar..
| İlgili Modüller |
İlgili Direktifler |
|---|---|
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.
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.
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
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: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.mod_expires
'ın sağladığı direktiflerle bir "expiration date" belirleyin;
böylece tarayıcı ve proxy' ler bunları cache' de tutmayı
geçerli sayar.<!--#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
.
<!--#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" -->
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.
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" -->
Aşağıda, HTML dokümanlarınızda SSI ile yapabileceğiniz bazı işlemlerle ilgili örnekler bulunmaktadır.
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.
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.
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)
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.
İç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.
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.
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}"
-->
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 -->
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.
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.