HTTP Header

Titan Bagus Br.
Amikom Computer Club
13 min readMar 27, 2021

1. HTTP HEADER

HTTP header adalah sebuah data yang dikirim antara web browser dengan web server sebagai sarana komunikasi antar keduanya. Di dalam HTTP header terdapat informasi tentang bagaimana cara menangani file yang dikirim / diminta. Agar pengertian ini lebih mudah dipahami, mari kita bahas sedikit tentang siklus request respond untuk halaman web:

Ketika kita mengakses suatu halaman web, web browser secara otomatis mengirim sebuah HTTP request kepada web server. HTTP request berisi banyak informasi, salah satunya adalah HTTP header. Di dalam HTTP header (yang dikirim pada saat proses request) terdapat informasi tentang file apa yang diminta (apakah file HTML, file PHP, file PDF, atau yang lain), serta berbagai info tambahan seperti jenis web browser yang dipakai, sistem operasi, dan alamat IP. Dalam gambar di atas, ini ada di panah nomor 1. Setelah sampai di web server, informasi yang ada di HTTP header akan dibaca dan web server mempersiapkan file-file yang diminta. Setelah itu, web server mengirim kembali file-file tersebut kepada web browser. Proses pengembalian ini dikenal juga dengan sebutan HTTP R\ respond (panah nomor 2).

HTTP respond ini terdiri dari 2 bagian: HTTP header dan file web. HTTP header berisi informasi mengenai file web yang dikirim, seperti tipe data, tanggal dikirim, nama web server, dan sistem operasi yang digunakan oleh web server. Sedangkan file web sendiri terdiri dari file HTML yang menyusun halaman web, termasuk juga file gambar (jika ada). Perhatikan bahwa terdapat 2 buah file HTTP header dalam diagram di atas, yakni ketika proses request dan pada saat proses respond. Khusus untuk proses respond, terdapat satu hal yang sangat penting untuk diketahui: HTTP header harus dikirim sebelum file web.

Sebagai analogi, jika presiden ingin berkunjung ke rumah kalian, tentu akan ada tim paspampres yang datang lebih awal. Mereka menginformasikan bahwa presiden akan datang pada jam sekian, dengan membawa sekian orang, dan informasi-informasi lain. Tim paspampres ini bisa disamakan dengan HTTP header yang datang lebih dahulu sebelum file asli dikirim. Dalam prakteknya, kita tidak menyadari adanya HTTP header, bahkan mungkin tidak pernah mendengar istilah ini. Dan itu tidak salah, karena isi dari HTTP header ditujukan kepada pemrosesan di web browser, bukan untuk pengunjung web.

Berikut adalah contoh isi HTTP header dan file web yang dikirim dari web server ke web browser:

HTTP/1.1 200 OK

Date: Sat, 04 May 2019 12:42:53 GMT

Server: Apache/2.4.37 (Win32) OpenSSL/1.1.1a PHP/7.3.1 X-Powered-By: PHP/7.3.1

Content-Length: 241

Keep-Alive: timeout=5, max=100 Connection: Keep-Alive

Content-Type: text/html; charset=UTF-8

<!DOCTYPE html>

<html>

<head>

<meta charset=”UTF-8">

<title>Belajar PHP</title>

</head>

<body>

<! — … lanjutan dari kode HTML … →

Pada bagian paling atas terdapat status code HTTP. Angka 200 berarti tidak ada masalah. Jika tertulis 404 page not found, berarti halaman tidak ditemukan, kita tentu sudah akrab dengan kode 404 ini. Jika yang tampil adalah Angka 500, berarti ada kesalahan di server (internal server error). Setelah status code, terdapat beberapa baris informasi lain. Format penulisan HTTP header adalah pasangan dari “Label: value” (label, titik dua, sebuah spasi, dan value). Di baris paling bawah bisa terlihat kode HTML yang sebenarnya. Inilah kode HTML yang kita lihat di web browser. Web browser secara otomatis menyembunyikan bagian HTTP header karena memang bukan untuk dilihat, tapi lebih ke keterangan dari sebuah file web.

Cara melihat HTTP Header

Pertama, buka sebuah halaman web. Halaman ini bisa berupa web online atau dari localhost. Disarankan pakai halaman dari localhost saja agar tampilan HTTP headernya lebih sederhana. Setelah halaman tampil di web browser (bisa berupa halaman latihan kita sebelum ini), Buka menu Web Developer Tools atau tekan kombinasi tombol CTRL+SHIFT+I. Akan tampil jendela Developer Tools seperti gambar berikut:

Pilih tab Network (1), lalu refresh halaman atau tekan tombol Reload (2)

Selanjutnya akan tampil sebuah tabel yang diawali dengan angka 200, GET, dst. Nilai ini sebenarnya diambil dari HTTP header. Klik baris pertama:

Sekarang, kita bisa melihat isi dari HTTP header. Kalian mungkin harus memperbesar ukuran jendela Developer Tools agar seluruh tampilan bisa terlihat.

Pada bagian paling awal (nomor 1) terlihat status code, request method, serta alamat IP server. Pada bagian tengah (nomor 2) adalah isi dari HTTP header response (dari web server ke web browser), sedangkan di bagian paling bawah (nomor 3) merupakan isi dari HTTP header request (dari web browser ke web server).

Kita tidak akan membahas semua isi dari HTTP header. Beberapa cukup jelas seperti tanggal (Date), tipe file (Content-Type), jenis aplikasi server (Server), serta jenis web browser (User- Agent). Jika kalian tertarik tentang seluruh informasi di HTTP header ini, bisa membacanya di wikipedia atau code.tutsplus.com.

Mengubah HTTP header dengan fungsi PHP header()

PHP mengizinkan kita untuk mengubah isi HTTP header yang dikirim dari web server melalui fungsi header(). Cara penggunaannya cukup dengan menulis label apa yang ingin diubah. Sebagai contoh, jika kita ingin mengubah status code menjadi 404, kita bisa menulis sebagai berikut:

<?php

header(“HTTP/1.1 404 Not Found”);

Mari kita coba, silahkan jalankan kode berikut dan lihat dari Web Developer Tools:

01. header_404.php

<?php

header(“HTTP/1.1 404 Not Found”); 3 ?>

<!DOCTYPE html>

<html lang=”id”>

<head>

<meta charset=”UTF-8">

<title>Belajar PHP</title>

</head>

<body>

<h1>Belajar HTTP header</h1>

</body>

</html>

Terlihat bahwa status code halaman berubah jadi 404. Walaupun demikian, halaman kita tetap diproses seperti biasa. Sebagai contoh lain, kita bisa mengubah HTTP header seperti berikut ini:

02. header_404_2.php

<?php

header(“HTTP/1.1 404 Halaman ini dimakan kucing”);

header(“X-Powered-By: PHP tempo doeloe”); 4 ?>

<!DOCTYPE html>

<html lang=”id”>

<head>

<meta charset=”UTF-8">

<title>Belajar PHP</title>

</head>

<body>

<h1>Belajar HTTP header</h1>

</body>

</html>

Dari sekian banyak label HTTP header yang tersedia, terdapat 1 label atau atribut yang paling sering digunakan dalam PHP, yakni label “Location”.

Mengalihkan tampilan ke halaman lain dengan fungsi PHP header()

Redirect adalah istilah web yang berarti mengalihkan pengunjung ke halaman lain. Fitur seperti ini umum dijumpai pada halaman login. Jika masuk dengan username dan password yang benar, kita akan di redirect ke halaman admin.php, sedangkan jika username dan password tidak cocok, akan di redirect ke halaman error.php. Fitur redirect ini bisa dibuat melalui fungsi header(). Caranya, dengan mengubah label “Location” dari HTTP header seperti contoh berikut:

03. redirect.php

<?php

header(“Location: https://www.duniailkom.com"); 3 ?>

<!DOCTYPE html>

<html lang=”id”>

<head>

<meta charset=”UTF-8">

<title>Belajar PHP</title>

</head>

<body>

<h1>Belajar HTTP header</h1>

</body>

</html>

Ketika halaman di atas dijalankan, web browser langsung di redirect ke situs www.duniailkom.com. Inilah hasil dari pemanggilan fungsi header (“Location: http://www.duniailkom.com") di baris 2. Secara teknis, yang terjadi adalah sebagai berikut:

PHP memproses halaman secara berurutan dari baris 1, dan di baris 2 ternyata terdapat perintah header(“Location: https://www.duniailkom.com"). PHP kemudian langsung mengirim status code 302 Redirect dan Location: www.duniailkom.com ke HTTP header.

HTTP header kemudian dikirim dari web server Apacle (tempat PHP dijalankan) ke web browser. Ketika mendapati isi HTTP header seperti ini, web browser langsung ‘pindah’ ke alamat yang ditulis di bagian Location. Berikut ilustrasi dari alur ini:

Yang juga perlu menjadi catatan, penulisan string Location harus langsung disambung dengan tkalian titik dua. Apabila ditulis seperti ini, fungsi redirect tidak akan berjalan:

header(“Location : http://www.duniailkom.com");

Perhatikan terdapat spasi antara “Location” dengan tkalian “ : “. Hasilnya tampil Server error!. Selain menggunakan alamat absolut seperti contoh di atas, kita juga bisa membuat alamat relatif untuk proses redirect:

04. redirect_password.php

<?php

$password=”rahasia”; 3

if ($password==”rahasia”){

header(“Location: admin.php”); 6 }

else{

header(“Location: error.php”); 9 }

?>

<!DOCTYPE html>

<html lang=”id”>

<! — lanjutan kode HTML disini — >

Jika kalian menjalankan kode di atas, web browser langsung di redirect ke halaman admin.php. Ini karena kondisi if ($password==”rahasia”) akan menghasilkan nilai true. Silahkan tukar string pembanding if menjadi: if ($password==”tidak tau”), maka halaman akan di redirect ke error.php. Kedua halaman ini belum kita buat, jadi memang akan menghasilkan error (halaman yang dituju tidak ditemukan).

Dalam prakteknya, nilai password ini berasal dari form login. Khusus untuk alamat absolut, penulisannya harus menyertakan bagian protocol, yakni bagian “http://”, jika tidak, ini artinya kita menggunakan alamat relatif. Berikut contoh kasusnya:

05. error_redirect.php

<?php

header(“Location: www.duniailkom.com"); 3 ?>

<!DOCTYPE html>

<html lang=”id”>

<! — lanjutan kode HTML disini — >

Halaman di atas tidak akan di redirect ke situs duniailkom, tetapi disambung ke alamat sekarang. Hasilnya, tentu saja tidak ditemukan alamat http://localhost/belajar_php/www.duniailkom.com.

Pada beberapa contoh penggunaan fitur redirect yang kita praktekkan, halaman web langsung berpindah ke tempat lain, padahal di bawahnya tetap terdapat kode HTML. Sebenarnya teks HTML ini tetap dikirim ke web browser sebelum proses redirect. Jadi, daripada web server tetap mengirim kode yang sebenarnya tidak akan tampil, kita bisa menambahkan fungsi die() atau exit() dari PHP setelah pemanggilan fungsi redirect().

Fungsi pelengkap header(): fungsi die() dan exit()

Fungsi die() dan exit() sebenarnya tidak berkaitan langsung dengan HTTP header maupun fungsi header(). Namun kedua fungsi ini memang sering digunakan pada saat pembuatan redirect. Fungsi die() dan exit() dipakai untuk memaksa PHP berhenti memproses kode program pada saat itu juga. Fungsinya mirip seperti perintah break dalam perulangan, tapi kali ini yang akan berhenti adalah seluruh kode PHP. Jika terdapat kode lain setelah pemanggilan fungsi die() atau exit(), kode tersebut tidak akan diproses.

Kedua fungsi ini bisa diinput dengan 1 argumen yang akan ditampilkan sebagai ‘pesan terakhir’ sebelum kode PHP berhenti.Fungsi die() sebenarnya adalah bentuk lain (alias) dari exit(). Di PHP Manual, hanya fungsi exit() yang dibahas. Bisa dibilang keduanya adalah fungsi identik. Mari lihat contoh penggunaannya:

06.die.php

<?php

$nama = “joko”;

if ($nama==”joko”) {

exit(“Maaf, joko tidak boleh masuk”);

echo “Horeee….”; // tidak akan pernah diproses

}

Dalam kode program ini kita membuat sebuah kondisi if. Jika variabel $nama berisi string joko, kode program akan langsung berhenti karena terdapat fungsi exit(). Hasil yang akan ditampilkan adalah:

Maaf, joko tidak boleh masuk

String “Horeee….” tidak akan dijalankan karena PHP sudah berhenti terlebih dahulu. Jika kita tidak ingin menampilkan pesan apa-apa, fungsi exit() bisa ditulis tanpa argumen, atau bahkan tanpa tkalian kurung:

07.die2.php

<?php

$nama = “andi”;

if ($nama==”joko”) {

exit();

}

if ($nama==”andi”) {

exit;

}

Fungsi exit() juga bisa ditulis tanpa tkalian kurung karena exit() merupakan sebuah language construct. Kembali ke pembahasan fungsi header(), kita bisa memaksa PHP untuk segera berhenti jika sudah di redirect. Berikut contohnya:

08. redirect_die.php

<?php

header(“Location: http://www.google.com"); 3 die();

?>

<!DOCTYPE html>

<html lang=”id”>

<! — lanjutan kode HTML disini — >

Pada saat dijalankan, web server akan langsung mengirim HTTP Header ke web browser untuk segera beralih ke situs www.google.com (redirect).

Akan tetapi pada saat itu, sisa halaman web juga ikut dikirim (walaupun tidak terlihat). Supaya lebih efisien, kita menambah fungsi die() untuk menghentikan PHP tepat setelah fungsi header(), sehingga kode program di bawahnya tidak ikut dikirim ke web browser. Efeknya memang tidak akan terasa, tapi jika kode HTML ini terdiri dari ribuan baris, cukup menyita kapasitas bandwidth web server.

Dalam prakteknya, fungsi exit() dan die() juga sering dipakai sebagai cara cepat untuk menghentikan kode PHP ketika terjadi suatu masalah. Misalnya jika koneksi ke database gagal, kita bisa memotong kode program pada saat itu juga sehingga PHP tidak akan memproses baris di bawahnya (yang memerlukan database).

2. OUTPUT BUFFERING

Pada awal bab ini, dijelaskan bahwa HTTP header harus dikirim lebih dulu sebelum isi web. Di dalam PHP, ini berarti kita harus menjalankan fungsi header() sebelum menampilkan apapun ke web browser (termasuk sebuah spasi!). Sebagai contoh, kode program berikut mungkin akan menghasilkan error:

09. error_header.php

<?php

echo “Teks ini sudah dikirim ke web browser”;

header(“Location:

http://www.google.com"); 4 ?>

<!DOCTYPE html>

<html lang=”id”>

<! — lanjutan kode HTML disini — >

Untuk versi XAMPP terbaru, kode program di atas tidak akan menghasilkan error karena fitur ouput buffering sudah aktif secara default. Kita akan bahas tentang hal ini sesaat lagi, untuk sementara kita menganggap kode di atas akan error.

Error terjadi karena kita menampilkan ‘sesuatu’ dengan perintah echo di baris 2 sebelum memanggil fungsi header(“Location: “). ‘Sesuatu’ di sini bisa berupa karakter apapun, termasuk sebuah spasi:

10. error_header2.php

<?php

header(“Location: http://www.google.com"); 3 ?>

<!DOCTYPE html>

<html lang=”id”>

<! — lanjutan kode HTML disini — >

Kode program di atas juga akan menghasilkan error yang sama. Tapi apakah kalian melihat ada yang salah? Ini nyaris tidak terdeteksi, tapi sebelum tag pembukan PHP <?php, terdapat sebuah spasi! Ketika kita menjalankan fungsi redirect PHP, syarat ini harus selalu diingat. Fungsi header(“Location: “) wajib ditempatkan pada baris paling awal. Akan tetapi, kita bisa menulis kode berikut dan tidak akan menghasilkan error:

11. error_header3.php

<?php

header(“Location:

http://www.google.com");

?>

<!DOCTYPE html>

<html lang=”id”>

<! — lanjutan kode HTML disini — >

Walaupun kita menambah beberapa spasi, ini tidak menjadi masalah karena spasi berada di dalam tag PHP. Yang menyebabkan error sebelumnya adalah terdapat spasi sebelum tag pembuka <?php.

“Tapi mas, sewaktu kita menjalankan kode yang dianggap error sebelumnya, tidak ada masalah dan langsung redirect ke situs www.google.com). Kenapa ya?”

Ini terjadi karena settingan output buffering di versi PHP yang kalian gunakan telah aktif.

Output buffering adalah sebuah fitur yang disediakan PHP untuk ‘menampung’ seluruh fungsi yang akan mengubah HTTP header. Salah satu fungsi tersebut adalah header() yang kita bahas di sini. Jika fitur output buffering tidak aktif, seluruh fungsi seperti header() wajib hukumnya ditulis di baris paling atas. Output buffering bisa diibaratkan sebagai “ember” penampung fungsi header(). Perhatikan gambar berikut:

Sekarang, sebelum HTTP respond dikirim ke web browser, web server akan menampungnya ke “ember” output buffering terlebih dahulu. Di dalam output buffering, struktur HTTP header disusun dan dirapikan agar kembali berada di posisi paling awal. Dengan demikian, kita bisa mengubah HTTP header kapan pun sepanjang kode program PHP. Selain header(), fungsi lain yang juga akan memodifikasi HTTP header adalah cookie() dan session(). Kita akan bahas kedua materi ini di bab tersendiri.

Pada beberapa versi PHP, fitur output buffering telah aktif secara default. Untuk memeriksanya, silahkan jalankan fungsi phpinfo(), lalu cari baris output_buffering. Phpinfo bisa diakses dari menu home XAMPP di alamat http://localhost/dashboard/phpinfo.php, atau bisa juga dengan cara menjalankan kode program berikut:

<?php

phpinfo();

?>

Kemudian, cari kata output_buffering. Gunakan fitur find untuk mempercepat proses pencarian (CTRL + F).

Jika di baris ini tidak ada nilai apa-apa (no value), berarti output buffering belum aktif. Tapi jika terdapat nilai seperti 4096, atau on. Berarti output buffering sudah aktif. Apabila fitur output buffering belum aktif (atau ingin mematikannya), bisa diatur dari file php.ini.

3. KONFIGURASI FILE PHP.INI

Sampai saat ini, kita belum membahas salah satu file terpenting dan wajib diketahui oleh setiap programmer PHP, yakni file php.ini. File php.ini berisi seluruh pengaturan PHP, mulai dari menampilkan pesan error, mengatur lama eksekusi program, hingga mengaktifkan PHP extension. Kali ini kita akan mencoba mengaktifkan fitur Output buffering dari php.ini. Langkah pertama adalah mencari lokasi file tersebut. Masih dari tampilan phpinfo(), di bagian atas halaman terdapat nilai “Loaded Configuration File”. Kalian juga bisa menggunakan fitur Find untuk mencarinya.

Isi dari Loaded Configuration File berupa alamat file php.ini. Jika kalian menginstall XAMPP di drive C, nilainya adalah C:\xampp\php\php.ini. Silahkan cari file ini menggunakan Windows Explorer. Setelah ditemukan, buka dengan Notepad++ atau teks editor lain:

Jika sudah terbuka, kalian bisa lihat-lihat sebentar apa saja yang ada di dalam file ini. Seluruh pengaturan PHP bisa kita ubah dari file ini. Tkalian titik koma ( ; ) di awal setiap baris merupakan komentar di dalam php.ini. Artinya, apapun yang diawali dengan tkalian titik koma ( ; ), berarti tidak aktif.

Untuk mengaktifkan output buffering, carilah baris output_buffering (gunakan fitur pencarian di teks editor). Kalian akan menemukan 3 lokasi dengan teks “output_buffering”.

Carilah yang di depannya tidak memiliki karakter titik koma ( ; ), seperti tampilan berikut:

Untuk mengaktifkan output buffering, bisa mengisi nilai “on” atau nilai angka seperti “4096”. Angka ini adalah jumlah memory yang disediakan untuk menampung HTTP header (dalam satuan byte). 4096 berarti bisa menampung sekitar 4MB atau 4096 karakter. Jika kita memberikan nilai “on”, artinya tidak ada limit untuk output buffering. Atau jika kalian ingin mematikan output buffering, isi dengan nilai off. Dalam contoh ini kita akan menggunakan nilai 4096. Silahkan ubah nilai output_buffering menjadi 4096, seperti gambar berikut:

Save php.ini, kemudian restart Apache web server. Caranya, klik tombol stop, lalu klik kembali tombol start. Untuk memeriksa apakah output buffering telah aktif, jalankan kembali phpinfo(), lalu cari baris “output_buffering”. Jika sudah berubah menjadi 4096, berarti fitur output buffering sudah berjalan.

Jika kalian mendapati fitur output buffering telah aktif sejak awal, kita menyarankan untuk coba mematikannya dengan mengubah nilai output_buffering=off dari php.ini, lalu jalankan kode program “error” kita sebelumnya. Ini agar kalian bisa melihat langsung dampak ketika fitur output buffering tidak aktif. Karena untuk website ‘live’, ada web hosting yang tidak menyediakan fitur output buffering.

Mengaktifkan output buffering sebenarnya akan menambah sedikit beban web server, karena ada proses tambahan yang dilakukan sebelum halaman web dikirim ke web browser. Walaupun begitu, hal ini tidak terlalu berdampak besar dan membuat penulisan kode program jadi lebih mudah terutama jika kita menggunakan banyak fungsi-fungsi HTTP header.

Fungsi ob_start() dan ob_end_flush() untuk output buffering lokal

Di dalam web ‘nyata’, besar kemungkinan kita tidak bisa mengakses file php.ini. Biasanya pihak web hosting membatasi hak akses untuk alasan keamanan. Beberapa web hosting secara default juga tidak mengaktifkan fitur output buffering. Tapi masih terdapat cara untuk menjalankan output buffering secara lokal untuk sebuah halaman. Caranya adalah dengan menjalankan fungsi ob_start() dan ob_end_flush(). Fungsi ob_start() berguna untuk memulai proses buffer, sedangkan fungsi ob_end_flush() untuk mengakhirinya. Fungsi ob_start() harus ditempatkan pada posisi paling awal kode program, sedangkan fungsi ob_end_flush() bisa ditempatkan di baris mana saja ketika kode program yang mengakses HTTP Header sudah selesai ditulis.

Dengan pengaturan output_buffering=”off”, kita bisa menjalankan kode berikut:

12.buffer.php

<?php

ob_start();

echo “Teks ini sudah dikirim ke web browser”;

header(“Location: http://www.google.com"); 5 ?>

<!DOCTYPE html>

<html lang=”id”>

<head>

<meta charset=”UTF-8">

<title>Belajar PHP</title>

</head>

<body>

<h1>Belajar HTTP header</h1>

</body>

</html>

<?php

ob_end_flush();

?>

Sekarang, kita bisa membuat perintah echo sebelum fungsi header(), walaupun pengaturan output_buffering di php.ini tidak aktif. Tapi kita tidak bisa menjalankan kode program berikut:

<?php

echo “Teks ini sudah dikirim ke web browser”;

ob_start();

header(“Location: http://www.google.com"); 5 ?>

<!DOCTYPE html>

<html lang=”id”>

<head>

<meta charset=”UTF-8">

<title>Belajar PHP</title>

</head>

<body>

<h1>Belajar HTTP header</h1>

</body>

</html>

<?php

ob_end_flush();

?>

Hasil kode program:

Warning: Cannot modify header information — headers already sent

Ini terjadi karena fungsi ob_start() harus ditempatkan di baris paling awal kode PHP. Pembahasan dalam bab kali ini mungkin sedikit rumit, tapi pemahaman tentang HTTP Header akan membatu kalian untuk memahami cara kerja web server dan web programming secara keseluruhan. Selain itu, materi ini juga berguna untuk menjelaskan sistem kerja form, cookie dan session PHP.

--

--

Titan Bagus Br.
Amikom Computer Club

Never been a priority for anyone. Except for my mum, my sisters, and my brothers.