Bölüm 3: CGI Ortam Değişkenleri

Ortam değişkenleri CGI programı çalıştırılıdığı zaman browser'ınızın (ve web server'ınızın) programa gönderdiği bilgilerdir. Ortam değişkenleri %ENV isimli Hash değişkende saklanır.

 CGI Ortam Değişkenleri
 DOCUMENT_ROOT  Server'ınızın kök dizinini verir.
 HTTP_COOKIE  Eğer varsa ziyaretçinin "cookie"sini verir.
 HTTP_HOST  Server'ınızın "hostname"ini verir.
 HTTP_REFERER  Scriptin çağrıldığı sayfanın adresini verir.
 HTTP_USER_AGENT  Ziyaretçinin browser'ının tipini verir.
 PATH  Server'ınızın "system path"ini verir. (Genelde /bin, /usr/sbin vs.)
 QUERY_STRING  GET metodu ile yollanan bilgiyi verir.
 REMOTE_ADDR  Ziyaretçinin IP adresini verir.
 REMOTE_HOST  Ziyaretçinin "hostname"ini verir. (*)
 REMOTE_PORT  Ziyaretçinin web server'ınıza bağlandığı portu verir.
 REMOTE_USER  Ziyaretçinin kullanıcı adını verir. (.htaccess korumalı sayfalar için)
 REQUEST_METHOD  Bilgi gönderme metodunu verir. (GET ya da POST)
 SCRIPT_FILENAME  Scriptin tam yolunu verir.
 SERVER_ADMIN  Server'ınızın webadmin'inin e-mail adresini verir.
 SERVER_NAME  Server'ınızın tam domain adını verir. (Örn: cc.sau.edu.tr)
 SERVER_PORT  Server'ınızın dinlemede olduğu portu verir.
 SERVER_SOFTWARE  Serverdaki web server programını verir. (Örn: Apache 1.3)

(*) Eğer server'ınızda "reverse-name-lookups" yoksa REMOTE_HOST ziyaretçinin IP adresini verir.

Bazı server'larda bunlardan başka değişkenler de olabiliyor. Daha fazla bilgi için server'ınızın dökümanlarını inceleyiniz. Farketmişseniz bazı değişkenler server'la ilgili, bazıları ise ziyaretçi ile ilgili bilgileri içeriyor. Server'la ilgili olanların programa bildirdiği bilgiler o server'da çalışan bütün CGI programları için aynı olacaktır. Fakat ziyaretçi ile ilgili bilgiler program her çalıştırıldığında farklı olabilir.

Her CGI çalıştırıldığında bütün ortam değişkenleri atanmaz. REMOTE_USER değişkeni sadece .htaccess dosyası ile korunan dizin ya da altdizinler için atanır. Bu durumda REMOTE_USER değişkeninin alacağı değer .htaccess dosyasındaki kullanıcı adıdır.

%ENV değişkeni CGI çalıştırıldığında otomatik olarak atanır ve isterseniz tamamını isterseniz sadece belli değerleri kullanabilirsiniz. Mesela aşağıdaki kod ile ziyaretçinin IP adresini yazdırabilirsiniz.

    print "IP adresiniz: $ENV{'REMOTE_ADDR'}\n";

Şimdi bütün ortam değişkenlerini yazdıran bir CGI yazalım. Yeni bir dosya oluşturun, "ortam.cgi" adıyla kaydedin ve içine şunları yazın:

    #!/usr/bin/perl

    print "Content-type:text/html\n\n";
    print <<HTMLSonu;
    <html><head><title>Ortam Değişkenleri</title></head>
    <body>
    HTMLSonu
    ;

    foreach $anahtar (sort(keys %ENV)) {
       print "$anahtar = $ENV{$anahtar}<br>\n";
    }

    print "</body></html>";

Denemek için tıklayın

Scripti kaydedin, erişim yetkilerini 755 olarak ayarlayın ve browser'ınızdan çağırın. Eğer hata mesajı alırsanız programı UNIX'te çalışmayı deneyip hatanın nerede olduğunu öğrenebileceğinizi hatırlayın.

Bu örnekte sort fonksiyonu kullanılarak %ENV değişkeninin anahtarları alfabetik sıraya koyduk. Perl'ün sort fonksiyonu karakter değerlerini karşılaştırdığı için sayıları düzgün bir şekilde sıraya koyamaz.

Basit Bir Sorgu Formu

Bir HTML formundan CGI'a bilgi göndermek için iki yol vardır. GET ve POST. Form bilgisinin server'a nasıl yollandığını bu metodlar belirler. GET metodunda formla gönderilen bilgiler URL'in bir parçası olarak gönderilir ve QUERY_STRING ortam değişkenine atanır. POST metodunda nasıl gönderildiğini bir sonraki bölümde anlatacağız.

QUERY_STRING değişkenine birkaç değişik yolla atama yapabiliriz. Birinci yöntem aşağıda görüldüğü gibidir.

http://www.sinanilyas.com/cgi-bin/ornek/ortam.cgi?deneme1
http://www.sinanilyas.com/cgi-bin/ornek/ortam.cgi?deneme2
http://www.sinanilyas.com/cgi-bin/ornek/ortam.cgi?deneme3

Yukarıdaki linklerin her birine tıklayın. QUERY_STRING değişkeninin değerinin soru işaretinden sonra gelen yazı olduğunu göreceksiniz. Bu örneklerde QUERY_STRING değişkeni "deneme1","deneme2" ve "deneme3" değerlerini alır.

Bir başka yöntem de aşağıdaki gibi basit bir form hazırlamaktır.

    <form action="http://www.sinanilyas.com/cgi-bin/ornek/ortam.cgi" method="GET">
    Buraya birşeyler yazın: <input type="text" name="ornek_yazi" size=30><p>
    </form>

Denemek için tıklayın

"Gönder" düğmesinin olmadığını farketmişsinizdir sanırım. GET metodu ile sadece enter'a basarsınız ve form gönderilir. (Bu yöntem sadece bir tane girdi alanı olduğu zaman işe yarar. Birden fazla girdi alanını göndermek için mutlaka "Gönder" düğmesi koymalısınız.)

Yukarıdaki kodları kullanarak bir HTML dosyası hazırlayın ve "get.html" adıyla kaydedip browser'ınızla açın. Daha sonra form alanına birşeyler yazın ve enter'a basın. QUERY_STRING değişkeninin değeri aşağıdaki gibi olur.

    $ENV{'QUERY_STRING'} = ornek_yazi=iste+yazdiginiz+yazi

Eşittir (=) işaretinin solundaki yazı form alanının adıdır. Sağındaki yazı ise formdaki kutucuğa yazdığınız yazıdır. FAKAT farkettiğiniz gibi boşlukların yerini artı (+) işareti almış. Hatta çeşitli noktalama işaretleri ve özel karakterlerin yerine %-kod şeklinde özel kodlar çıkmış.

Buna "URL Kodlama" denir ve ister GET metodu ister POST metodu kullanılsın, herhangi bir form ile bilgi gönderildiği zaman meydana gelir.

Perl scriptiniz bu bilgiyi eski haline getirebilir fakan uzun ve karmaşık bilgiler yollandığında POST metodunu kullanmak daha iyidir. GET metodu daha çok veritabanından bilgi aratma gibi tek alanlı formlar için elverişlidir.

GET metodu ile birden fazla alanlı formları da gönderebilirsiniz.

    <form action="http://www.sinanilyas.com/cgi-bin/ornek/ortam.cgi" method="GET">
    <pre>
       Adınız: <input type="text" name="ad" size=30><p>
    Soyadınız: <input type="text" name="soyad" size=30><p>
    </pre>
    <input type="submit" value="Gönder">
    </form>

Denemek için tıklayın

Bo formla gönderilen bilgiler aşağıdaki gibi görünür.

    $ENV{'QUERY_STRING'} = ad=umut+baris&soyad=ruzgar

Değerler & işareti ile ayrılmıştır. Bu iki değeri birbirinden ayırmak için Perl'ün split fonksiyonunu kullanacağız.

    @degerler = split(/\&/,$ENV{'QUERY_STRING'});
    foreach $i (@degerler) {
         ($alanadi, $deger) = split(/=/,$i);
         print "$alanadi = $deger\n";
    }

split fonksiyonu bir karakter sırasını, belirtilen karakter ya da karakterlerden ayırarak bir dizi oluşturur. Örneğimizin ilk satırında QUERY_STRING değişkeninin değeri & işaretinden ikiye ayrılmıştır. & işaretinden önce \ kullanılmasının nedeni & işaretinin Perl'de özel bir anlamı olmasıdır. (Perl'de bazı özel karakterleri kullanırken başına \ işareti koymamız gerekebilir). Bu ayırma işlemi sonucu @degerler dizisine iki değer atanır: ad=umut+baris ve soyad=ruzgar. foreach döngüsünde önce = işaretinden alan adı ve alanlara yazılan yazılar birbirinden ayrılarak $alanadi ve deger değişkenlerine atanır. Sonra da birbirinden ayrılmış olan bu değerler yazdırılır.

GET metodu hakkında bazı uyarılar: Bu metod bilgi göndermek için güvenli değildir. Bu yüzden şifre ve kredi kartı bilgileri gibi gizli bilgileri gönderirken asla bu metodu kullanmayınız. Gönderilen bilgi URL'in bir parçası olarak gönderildiği için server'ın log dosyalarında kaydedilir ve log dosyaları da server'daki bütün kullanıcılar tarafından okunabilir. Gizli bilgiler bir sonraki bölümde göreceğimiz POST metodu ile güvenli bir biçimde gönderilebilir.

Önceki Konular Sonraki

     

©1997-2005, Sinan İLYAS