Panduan untuk Menulis Script CGI di REXX dan Perl

Last Update: 24 Juli 1998 .


Isi


Pengantar

Panduan ini ditujukan untuk orang yang ingin menuli WWW script executable mereka sendiri menggunakan WWW ini Common Gateway Interface ( CGI ). Meskipun penekanan utama adalah pada REXX banyak contoh juga disediakan di Perl.

Ada beberapa perpustakaan perangkat lunak sederhana untuk memudahkan penulisan skrip CGI. Cgi-lib.rxx adalah library REXX fungsi (tersedia di SLAC dengan menggunakan REXXPANGGILAN putenv 'REXXPATH = / afs / SLAC / www / SLAC / www / alat / cgi -rexx ' pernyataan untuk memasukkan perpustakaan pada waktu eksekusi) dan cgi-lib.pl adalah perpustakaan yang sama di Perl ditulis oleh Steve Brenner (ada salinan executable dari libary ini di SLAC di / afs / SLAC / g / www / cgi lib / cgi-lib.pl ). NCSA memiliki satu set yang sangat berguna Perl CGI subrutin handler yang tersedia melalui anonymous FTP .Another set Perl CGI Scripts Server Side ditulis oleh Brigitte Jellinek tersedia di bawah lisensi publik GNU. Ada juga Source code untuk script www.stanford.edu dan program . Ada juga indeks untuk program Perl WWW dikumpulkan oleh Earl Hood. Akhirnya melihat Web Development Center .

Karena ada keamanan dan risiko lain yang terkait dengan menjalankan skrip pengguna di server WWW, pembaca mungkin ingin pertama melihat informasi dokumen menyediakan pada SLACKeamanan Wrapper untuk skrip CGI pengguna. Selain meningkatkan keamanan, wrapper ini juga menyederhanakan tugas menulis skrip CGI untuk pemula.

Sebelum memulai menulis naskah, Anda juga mungkin ingin memeriksa beberapa catatan kasar di SLAC Web Utilitas Diperoleh Script CGI .

CGI adalah sebuah antarmuka untuk menjalankan program eksternal, atau gateway, di bawah server informasi. Saat ini, server informasi yang didukung adalah HTTP (Protokol Transport yang digunakan oleh WWW) server.

Program Gateway adalah program executable (misalnya skrip UNIX) yang dapat dijalankan sendiri (tetapi Anda tidak ingin kecuali untuk tujuan debugging). Mereka telah dibuat executable untuk memungkinkan mereka untuk berjalan di bawah berbagai server informasi (mungkin sangat berbeda) secara bergantian. program Gateway sesuai dengan spesifikasi ini dapat ditulis dalam bahasa apa pun, termasuk REXX atau Perl, yang menghasilkan file executable.

Mendapatkan Masukan ke Script

Input dapat dikirimkan ke script dalam beberapa cara tergantung pada klien Uniform Resource Locator ( URL ) atau HyperText Markup Language ( HTML ) Form :

  • QUERY_STRING Variabel Lingkungan

    QUERY_STRING didefinisikan sebagai sesuatu yang mengikuti pertama? di URL yang digunakan untuk mengakses gateway. Informasi ini dapat ditambahkan dengan dokumen HTML isindex, atau dengan Formulir HTML (dengan tindakan GET). Hal ini juga dapat secara manual tertanam dalam sebuah hypertext tautan HTML, atau jangkar , yang referensi gateway.String ini biasanya akan menjadi permintaan informasi, misalnya apa yang diinginkan pengguna untuk mencari dalam database, atau mungkin hasil dikodekan Formulir umpan balik Anda.Hal ini dapat diakses di REXX dengan menggunakan String = getenv ( 'QUERY_STRING')
    atau dalam Perl dengan menggunakan $ string = $ ENV ( 'QUERY_STRING');

    String ini dikodekan dalam format standar URL yang mengubah spasi untuk +, dan encoding karakter khusus dengan% xx heksadesimal encoding. Anda akan perlu untuk memecahkan kode itu dalam rangka untuk menggunakannya. Anda dapat meninjau cgi-lib.rxx REXX PROSEDUR DeWeb atau Perl kode fragmen memberikan contoh bagaimana untuk memecahkan kode karakter khusus.

    Jika server Anda tidak decoding hasil dari Form, Anda juga akan mendapatkan string diterjemahkan untuk Anda ke baris perintah. Ini berarti bahwa string akan tersedia di REXX melaluimengurai ARG perintah, atau dalam Perl $ ARGV [n] array yang.

    Misalnya, jika Anda memiliki URL http://www.slac.stanford.edu/cgi-bin/foo?hello+world dan Anda menggunakan perintah REXX mengurai ARG ARG1 arg2 kemudian ARG1 akan berisi"halo" dan arg2 akan berisi "dunia" (yaitu tanda + diganti dengan spasi). 
    dalam Perl $ ARGV [1] berisi "halo" dan ARGV $ [2] berisi "dunia" . Jika Anda memilih untuk menggunakan baris perintah untuk mengakses input, Anda perlu melakukan sedikit pengolahan data sebelum menggunakannya.

  • PATH_INFO Variabel Lingkungan

    Sebagian besar waktu, Anda akan ingin mengirim data ke gateway Anda yang klien tidak harus kotoran dengan. Informasi tersebut bisa menjadi nama Form yang dihasilkan hasil yang mereka kirim.

    CGI memungkinkan untuk informasi tambahan untuk dimasukkan dalam URL untuk gateway yang dapat digunakan untuk mengirimkan informasi konteks khusus ekstra untuk script.Informasi ini biasanya tersedia sebagai informasi "ekstra" setelah jalur gateway dalam URL. Informasi ini tidak dikodekan oleh server dengan cara apapun. Hal ini dapat diakses di REXX dengan menggunakan String = getenv ( 'PATH_INFO') , atau dalam Perl dengan menggunakan $ string = $ ENV ( 'PATH_INFO');

    Untuk menggambarkan hal ini, katakanlah saya punya script CGI yang dapat diakses untuk server saya dengan nama foo . Ketika saya mengakses foo dari dokumen tertentu, saya ingin memberitahu foo bahwa aku sedang dalam direktori bahasa Inggris, bukan direktori Pig Latin. Dalam hal ini, saya bisa mengakses naskah saya di dokumen HTML sebagai:

    foo

    Ketika server mengeksekusi foo, itu akan memberi saya PATH_INFO dari / language = Inggris , dan program saya bisa memecahkan kode ini dan bertindak sesuai.

    The PATH_INFO dan QUERY_STRING dapat dikombinasikan. Misalnya, URL: http: // www / cgi-bin / htimage / usr / www / img / peta 404.451? Akan menyebabkan server untuk menjalankan script yang disebut htimage . Ini akan menyampaikan informasi jalan yang tersisa " / usr / www / img / peta " untuk htimage dalam variabel lingkungan PATH_INFO, dan lulus " 405451 " dalam variabel QUERY_STRING. Dalam hal ini, htimage adalah script untuk melaksanakan peta aktif disertakan dengan HTTPD CERN.

  • Standard input

    Jika Form Anda memiliki METODE = "POST" di tag FORM, program CGI Anda akan menerima masukan Formulir dikodekan pada standard input ( stdin di Unix). Server tidak akan mengirimkan EOF pada akhir data tersebut, bukannya Anda harus menggunakan variabel lingkungan CONTENT_LENGTH untuk menentukan berapa banyak data yang harus dibaca dari stdin. Anda dapat melakukannya di REXX dengan menggunakan Dalam = Charin (, 1, getenv ( 'CONTENT_LENGTH')) , atau dalam Perl dengan menggunakan baca (STDIN, $ di, $ ENV { 'CONTENT_LENGTH'});

    Jika Anda ingin lulus standar input ke script lain yang Anda akan menelepon nanti, maka Anda mungkin ingin meninjau cgi-lib.rxx REXX PROSEDUR ReadPost .

Anda dapat meninjau REXX Kode Fragmen memberikan contoh cara membaca berbagai bentuk masukan ke dalam naskah Anda.

The REXX prosedur ReadForm bersama-sama dengan MethGet dan MethPost , semua tersedia di cgi-lib.rxx , dapat digunakan untuk menyederhanakan tugas membaca masukan dari Formulir.

Bentuk decoding Masukan

Ketika Anda menulis Form, masing-masing item masukan Anda memiliki nama tag. Ketika tempat pengguna data dalam barang-barang ini di Formulir, informasi yang dikodekan ke dalam data Form. Nilai masing-masing item input yang diberikan oleh pengguna disebut nilai .

Form data aliran nama = nilai pasangan yang dipisahkan oleh karakter ampersand (&). Setiap nama = nilai pasangan adalah URL dikodekan, yaitu ruang yang berubah menjadi tanda plus dan beberapa karakter dikodekan dalam heksadesimal. Untuk decode data Form Anda harus terlebih dahulu mengurai Form blok data ke terpisah nama = nilai pasangan melemparkan keluar ampersands. Maka Anda harus mengurai setiap nama = nilai pasangan ke dalam terpisah nama dan nilai . Gunakan tanda sama pertama yang Anda temui untuk membagi data. Jika ada lebih dari satu, maka ada sesuatu yang salah dengan data. Sekali lagi membuang equals tanda-tanda. Akhirnya membatalkan encoding URL dari setiap nama dan nilai .

Anda dapat meninjau REXX atau Perl kode fragmen memberikan contoh decoding input Form.

Bila menggunakan nama dan nilai informasi dalam script, Anda perlu menyadari bahwa:

  • tidak menentukan urutan nama = nilai akan digabungkan di;
  • tidak setiap nama dan nilai yang ditetapkan dalam formulir tersebut tentu dikirim oleh klien, misalnya jika tidak ada yang dipilih dalam daftar bergulir maka tidak dengan nama maupunnilai akan dikirim;
  • lebih dari satu nilai dapat dikirim untuk diberikan nama , misalnya jika daftar bergulir memungkinkan pemilihan beberapa pilihan.

Mengirim Dokumen Kembali ke Client

Program CGI dapat kembali segudang jenis dokumen. Mereka dapat mengirim kembali gambar ke klien, sebuah dokumen HTML, dokumen plaintext, sebuah dokumen Postscript atau mungkin bahkan klip audio dari fungsi tubuh Anda. Mereka juga dapat kembali referensi ke dokumen lain (untuk menghemat ruang kita akan mengabaikan kasus terakhir ini di sini, informasi lebih lanjut dapat ditemukan di NCSA ini CGI Primer ). Klien harus tahu apa jenis dokumen yang Anda mengirimnya sehingga dapat hadir sesuai. Agar klien untuk mengetahui hal ini, program CGI Anda harus memberitahu server apa jenis dokumen itu kembali.

Untuk memberitahu server apa jenis dokumen Anda mengirim kembali, CGI mengharuskan Anda untuk menempatkan header pendek pada output. Header ini adalah teks ASCII, yang terdiri dari garis-garis yang dipisahkan oleh salah linefeeds atau tombol kembali diikuti oleh linefeeds. Output keharusan naskah Anda setidaknya dua baris seperti sebelum datanya akan dikirim langsung kembali ke klien. Garis-garis ini digunakan untuk menunjukkan tipe MIME dari dokumen berikut

Beberapa jenis MIME umum yang terkait dengan WWW adalah:

  • Sebuah "text" Content-Type yang digunakan untuk mewakili informasi tekstual dalam jumlah set karakter dan diformat bahasa teks deskripsi dengan cara yang standar. Dua subtipe yang paling mungkin adalah:
    • text / plain : teks tanpa persyaratan format khusus.
    • text / html : text dengan perintah HTML tertanam
  • Sebuah "aplikasi" Content-Type, yang digunakan untuk mengirimkan data aplikasi atau data biner. Dua subtipe yang sering digunakan adalah:
    • aplikasi / postscript : Data ini di PostScript , dan harus diberi makan ke PostScript interptreter.
    • aplikasi / biner : data dalam beberapa format biner diketahui, seperti hasil transfer file.
  • Sebuah "image" Content-Type untuk transmisi gambar diam (foto) data. Ada banyak kemungkinan subtipe, tapi yang paling sering digunakan pada WWW adalah:
    • image / gif : gambar dalam format GIF.
    • image / xbm : gambar dalam format X Bitmap.
    • image / jpeg : gambar dalam format JPEG.

Untuk memberitahu server jenis konten keluaran Anda, baris pertama dari output Anda harus membaca: Content-type: tipe / subtipe mana jenis / subtipe adalah jenis MIME dan subtipe untuk output Anda.

Selanjutnya, Anda harus mengirim baris kedua. Dengan spesifikasi saat ini, baris kedua HARUS BLANK. Ini berarti bahwa itu harus memiliki apa-apa pada pohon itu selain linefeed a. Setelah server mengambil jalur ini, ia tahu bahwa Anda selesai mengatakan server tentang output dan sekarang akan mulai output aktual. Jika Anda melewatkan baris ini, server akan mencoba untuk mengurai output Anda mencoba untuk menemukan informasi lebih lanjut tentang permintaan Anda dan Anda akan menjadi sangat bahagia.

Anda dapat meninjau REXX Kode Fragment memberikan contoh penanganan Content-type informasi.

Setelah dua baris ini telah dikeluarkan, setiap output ke stdout (misalnya perintah REXX SAY) akan dimasukkan dalam dokumen yang dikirim ke klien. Output ini harus konsisten denganContent-type sundulan. Sebagai contoh jika header ditentukan Content-type text / html maka output berikut harus menyertakan format HTML seperti menggunakan
 atau 

 untuk memulai baris baru atau 

 untuk menghapus format otomatis HTML.

 

Diagnostik dan Kesalahan Pelaporan

Sejak stdout termasuk dalam dokumen yang dikirim ke, diagnostik diagnostik dikeluarkan dengan perintah SAY akan muncul dalam dokumen. Anda dapat meninjau REXX Kode Fragmentmemberikan contoh pelaporan diagnostik.

Jika kesalahan ditemui (misalnya tidak ada masukan yang diberikan, karakter yang tidak valid ditemukan, terlalu banyak argumen yang ditentukan, meminta perintah yang tidak valid akan dieksekusi, sintaks tidak valid atau variabel terdefinisi ditemui dalam naskah REXX) ​​script harus memberikan informasi rinci tentang apa yang salah dll Ini mungkin sangat berguna untuk memberikan informasi pada pengaturan dari berbagai Variabel WWW Lingkungan yang ditetapkan.

The CGIerror , CGIdie dan MyURL REXX prosedur di cgi-lib.rxx memberikan beberapa bantuan untuk pelaporan kesalahan. Selain meninjau fragmen kode REXX menggunakan CGIerror danmenggunakan CGIdie dan juga khas CGIerror keluaran dan CGIdie keluaran .

Dua Simple Script CGI REXX WWW

Untuk mendapatkan server Web Anda untuk menjalankan script CGI Anda harus:

  • Menulis naskah. Untuk menyederhanakan ini, Anda mungkin ingin mengambil keuntungan dari cgi-lib.rxx perpustakaan fungsi, termasuk beberapa diperkenalkan sebelumnya pada halaman ini. Beberapa contoh sederhana, namun lengkap dapat membantu:
    1. Sumber dari script untuk mengaktifkan UNIX jari fungsi.
    2. Sumber dari Formulir HTTP minimal dan Script .
  • Membuat script dieksekusi oleh server Web Anda. Di SLAC di Unix ini dilakukan dengan menggunakan chmod perintah, misalnya
    • chmod o + x /u/sf/cottrell/bin/cgi1.rxx 
      chmod u + x /u/sf/cottrell/bin/cgi1.rxx
  • Dapatkan Anda Web-Master untuk menambahkan aturan ke file aturan server Web untuk memungkinkan server Web untuk menjalankan script Anda. Informasi lebih lanjut tentang file aturan W3C server dapat ditemukan dengan melihat file konfigurasi dari W3C httpd , serta contoh sederhana dari beberapa laporan pemetaan dapat digunakan dalam file aturan.

Web-Master akan ingin memastikan bahwa Aspek Keamanan naskah Anda telah dibahas sebelum menambahkan script ke file Aturan.

Sumber lain Tujuan

  • Salinan dalam bentuk cetak:
    • Buku HTML & CGI Unleashed memiliki banyak informasi yang berguna tentang menulis skrip CGI di C, Perl dan REXX.
    • Buku Pengantar CGI / PERL oleh Steve Brenner & Edwin Aoki adalah pengenalan berguna untuk menulis skrip CGI di Perl.
  • Menulis World-Wide Script Web CGI di REXX disajikan pada musim semi 1996 SHARE Teknis Conference, 7 Maret 1996, Anaheim California.
  • The NetRexx Bahasa Halaman yang menyediakan informasi sebuah proyek percobaan oleh Mike Cowlishaw (yang autor dari REXX) ​​untuk membuat Rexx front end ke Jawa.
  • Juga menyetel ke newsgroup comp.infosystems.www.authoring.cgi yang meliputi pembahasan pengembangan Common Gateway Interface (CGI) script yang berhubungan dengan halaman web authoring. Kemungkinan mata pelajaran termasuk diskusi bagaimana menangani hasil bentuk, bagaimana untuk menghasilkan gambar dengan cepat, dan bagaimana menyusun penawaran Web interaktif lainnya.
  • The World Wide Web (Frequently Asked Questions, dengan Jawaban) menjawab banyak, banyak pertanyaan tentang World Wide Web pada umumnya.
  • Jika Anda menggunakan Perl dan Anda memiliki pertanyaan Perl umum yang tidak benar-benar sebuah pertanyaan CGI khusus, memeriksa Perl FAQ .
  • Jika Anda akan menulis skrip untuk Windows NT kemudian melihat Somarsoft - Jendela Masalah Keamanan NT