Cara menggunakan html cache-control

Apakah Anda seorang programmer atau bukan, Anda telah melihatnya di mana-mana di web. Saat ini address bar browser Anda menunjukkan sesuatu yang dimulai dengan "https://". Bahkan skrip Hello World pertama Anda mengirim HTTP header tanpa Anda menyadarinya. Dalam artikel ini kita akan belajar tentang dasar-dasar dari HTTP header dan bagaimana kita dapat menggunakannya dalam aplikasi web kita.

Apa itu HTTP Header?

HTTP adalah singkatan dari "Hypertext Transfer Protocol". Seluruh World Wide Web menggunakan protokol ini. Didirikan pada awal 1990-an. Hampir segala sesuatu yang Anda lihat dalam browser Anda ditransmisikan ke komputer Anda melalui HTTP. Misalnya, ketika Anda membuka halaman artikel ini, browser mungkin telah mengirim lebih dari 40 permintaan HTTP dan menerima respon HTTP untuk masing-masing.

HTTP header adalah bagian inti dari permintaan dan respon HTTP ini, dan mereka membawa informasi tentang browser klien, halaman yang diminta, server dan banyak lagi.

Cara menggunakan html cache-control
Cara menggunakan html cache-control
Cara menggunakan html cache-control

Contoh

Ketika Anda mengetik url di address bar, browser Anda mengirimkan permintaan HTTP dan itu mungkin terlihat seperti ini:

GET /tutorials/other/top-20-mysql-best-practices/ HTTP/1.1
Host: net.tutsplus.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5 (.NET CLR 3.5.30729)
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Cookie: PHPSESSID=r2t5uvjq435r4q7ib3vtdjq120
Pragma: no-cache
Cache-Control: no-cache

Baris pertama adalah "Request Line" yang berisi beberapa info dasar pada permintaan. Dan sisanya adalah HTTP header.

Setelah permintaan itu, browser Anda menerima respon HTTP yang mungkin terlihat seperti ini:

HTTP/1.x 200 OK
Transfer-Encoding: chunked
Date: Sat, 28 Nov 2009 04:36:25 GMT
Server: LiteSpeed
Connection: close
X-Powered-By: W3 Total Cache/0.8
Pragma: public
Expires: Sat, 28 Nov 2009 05:36:25 GMT
Etag: "pub1259380237;gz"
Cache-Control: max-age=3600, public
Content-Type: text/html; charset=UTF-8
Last-Modified: Sat, 28 Nov 2009 03:50:37 GMT
X-Pingback: https://net.tutsplus.com/xmlrpc.php
Content-Encoding: gzip
Vary: Accept-Encoding, Cookie, User-Agent

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Top 20+ MySQL Best Practices - Nettuts+</title>
<!-- ... rest of the html ... -->

Baris pertama adalah "Status Line", diikuti oleh "HTTP header", sampai dengan baris kosong. Setelah itu, "konten" dimulai (dalam kasus ini, HTML output).

Ketika Anda melihat kode sumber halaman web di browser Anda, Anda hanya akan melihat bagian HTML dan tidak HTTP header, meskipun mereka benar-benar telah dikirimkan bersama-sama seperti yang Anda lihat di atas.

Permintaan HTTP ini juga dikirim dan diterima untuk hal-hal lain, seperti gambar, file CSS, file JavaScript dll. Itu sebabnya saya katakan sebelumnya bahwa browser Anda telah mengirimkan permintaan HTTP setidaknya 40 atau lebih saat Anda memuat hanya halaman artikel ini.

Sekarang, mari kita mulai meninjau strukturnya secara lebih rinci.

Cara Melihat HTTP Header

Saya menggunakan ekstensi Firefox berikut untuk menganalisis HTTP header:

  • Firebug

Cara menggunakan html cache-control
Cara menggunakan html cache-control
Cara menggunakan html cache-control

  • Live HTTP Headers

Cara menggunakan html cache-control
Cara menggunakan html cache-control
Cara menggunakan html cache-control

Di PHP:

  • getallheaders() mendapat header permintaan. Anda juga dapat menggunakan array $_SERVER.
  • headers_list() mendapatkan header respon.

Lebih lanjut dalam artikel ini, kita akan melihat beberapa contoh kode dalam PHP.

Struktur Permintaan HTTP

Cara menggunakan html cache-control
Cara menggunakan html cache-control
Cara menggunakan html cache-control

Baris pertama dari permintaan HTTP disebut garis permintaan dan terdiri dari 3 bagian:

  • "Metode" menunjukkan jenis apa permintaan ini. Metode yang paling umum adalah GET, POST dan HEAD.
  • "Jalan" umumnya bagian dari url yang datang setelah host (domain). Misalnya, ketika meminta "https://net.tutsplus.com/tutorials/other/top-20-mysql-best-practices/" , porsi jalan adalah "/tutorials/other/top-20-mysql-best-practices/".
  • Bagian "protokol" berisi "HTTP" dan versi, yang biasanya 1.1 di browser modern.

Sisa dari permintaan berisi HTTP header sebagai pasangan "Nama: Nilai" pada masing-masing baris. Ini berisi berbagai informasi tentang permintaan HTTP dan browser Anda. Misalnya, baris "User-Agent" menyediakan informasi pada versi browser dan Sistem Operasi yang Anda gunakan. "Accept-Encoding" memberitahu server jika browser Anda dapat menerima output terkompresi seperti gzip.

Anda mungkin memperhatikan bahwa data cookie juga ditularkan dalam HTTP header. Dan jika ada yang url acuan, maka akan ada di header juga.

Sebagian besar dari header ini adalah opsional. Permintaan HTTP ini bisa menjadi kecil seperti ini:

GET /tutorials/other/top-20-mysql-best-practices/ HTTP/1.1
Host: net.tutsplus.com

Dan Anda masih akan mendapatkan respon yang valid dari server web.

Metode Permintaan

Tiga metode permintaan yang paling umum digunakan adalah: GET, POST dan HEAD. Anda mungkin sudah akrab dengan dua yang pertama, dari menulis form html.

GET: Menerima Dokumen

Ini adalah metode utama yang digunakan untuk menerima html, gambar, JavaScript, CSS, dll. Sebagian besar data yang dimuat di browser Anda diminta menggunakan metode ini.

Misalnya, ketika loading artikel Nettuts+, baris pertama dari request HTTP terlihat seperti:

GET /tutorials/other/top-20-mysql-best-practices/ HTTP/1.1
...

Sekali html memuat, browser akan mulai mengirim permintaan GET untuk gambar, yang mungkin terlihat seperti ini:

GET /wp-content/themes/tuts_theme/images/header_bg_tall.png HTTP/1.1
...

Form web dapat diatur untuk menggunakan metode GET. Berikut ini adalah contohnya.

<form method="GET" action="foo.php">

First Name: <input type="text" name="first_name" /> <br />
Last Name: <input type="text" name="last_name" /> <br />

<input type="submit" name="action" value="Submit" />

</form>

Bila form dikirimkan, permintaan HTTP dimulai seperti ini:

GET /foo.php?first_name=John&last_name=Doe&action=Submit HTTP/1.1
...

Anda dapat melihat bahwa setiap input form ditambahkan ke dalam query string.

POST: Mengirim Data ke Server

Meskipun Anda dapat mengirim data ke server menggunakan GET dan query string, dalam banyak kasus POST akan lebih baik. Mengirim data dalam jumlah besar menggunakan GET adalah tidak praktis dan memiliki keterbatasan.

Permintaan POST adalah yang paling sering dikirim oleh form web. Mari kita mengubah contoh form sebelumnya ke metode POST.

<form method="POST" action="foo.php">

First Name: <input type="text" name="first_name" /> <br />
Last Name: <input type="text" name="last_name" /> <br />

<input type="submit" name="action" value="Submit" />

</form>

Mengirimkan form tersebut itu menciptakan sebuah permintaan HTTP seperti ini:

POST /foo.php HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5 (.NET CLR 3.5.30729)
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Referer: http://localhost/test.php
Content-Type: application/x-www-form-urlencoded
Content-Length: 43

first_name=John&last_name=Doe&action=Submit

Ada tiga hal penting untuk dicatat di sini:

  • Jalan di baris pertama adalah hanya /foo.php dan tidak ada query string lagi.
  • Header Content-Type dan Content-Lenght telah ditambahkan, yang memberikan informasi tentang data yang sedang dikirim.
  • Semua data sekarang dikirim setelah header, dengan format yang sama seperti query string.

Permintaan metode POST juga dapat dibuat melalui AJAX, aplikasi, cURL, dll. Dan semua form upload file diperlukan untuk menggunakan metode POST.

HEAD: Menerima Informasi Header

HEAD adalah identik dengan GET, kecuali server tidak mengembalikan konten di respon HTTP. Ketika Anda mengirim permintaan HEAD, itu berarti bahwa Anda hanya tertarik pada kode respon dan HTTP header, bukan dokumennya.

Ketika Anda mengirim permintaan HEAD, itu berarti bahwa Anda hanya tertarik pada kode respon dan HTTP header, bukan dokumennya.

Dengan metode ini browser dapat memeriksa apakah dokumen telah dimodifikasi, untuk tujuan caching. Juga dapat memeriksa apakah dokumennya ada.

Misalnya, jika Anda memiliki banyak link pada situs web Anda, Anda dapat secara berkala mengirim permintaan HEAD ke semua dari mereka untuk memeriksa link yang rusak. Ini akan bekerja jauh lebih cepat daripada menggunakan GET.

Struktur Respon HTTP

Setelah browser mengirimkan permintaan HTTP, server merespon dengan respon HTTP. Tidak termasuk konten, terlihat seperti ini:

Cara menggunakan html cache-control
Cara menggunakan html cache-control
Cara menggunakan html cache-control

Bagian pertama dari data adalah protokol. Ini lagi biasanya HTTP/1.x atau HTTP/1.1 pada server modern.

Bagian berikutnya adalah kode status yang diikuti dengan sebuah pesan singkat. Kode 200 berarti bahwa permintaan GET kami sukses dan server akan mengembalikan konten dari dokumen yang diminta, setelah header.

Kita semua telah melihat halaman "404". Nomor ini sebenarnya berasal dari kode status bagian dari respon HTTP. Jika permintaan GET akan dibuat untuk jalan yang tidak dapat ditemukan server, itu akan merespon dengan 404 daripada 200.

Sisa dari respon berisi header seperti permintaan HTTP. Nilai-nilai ini dapat berisi informasi tentang perangkat lunak server, ketika halaman/file yang terakhir diubah, mime type dll...

Lagi-lagi, sebagian besar dari header tersebut adalah benar-benar opsional.

Kode Status HTTP

  • 200 digunakan untuk permintaan yang sukses.
  • 300 adalah untuk pengalihan.
  • 400 digunakan jika ada masalah dengan permintaan.
  • 500 digunakan jika ada masalah dengan server.

200 OK

Seperti disebutkan sebelumnya, ini status kode yang dikirim dalam menanggapi permintaan yang berhasil.

206 Partial Content

Jika sebuah aplikasi hanya meminta serangkaian file yang diminta, kode 206 dikembalikan.

Ini paling sering digunakan dengan manajer download yang dapat menghentikan dan melanjutkan download, atau membagi download menjadi potongan-potongan.

404 Not Found

Cara menggunakan html cache-control
Cara menggunakan html cache-control
Cara menggunakan html cache-control

Ketika halaman atau file yang diminta tidak ditemukan, respon 404 adalah kode yang dikirim oleh server.

401 Unauthorized

Halaman web yang dilindungi password mengirim kode ini. Jika Anda tidak memasukkan login dengan benar, Anda akan melihat berikut ini di browser Anda.

Cara menggunakan html cache-control
Cara menggunakan html cache-control
Cara menggunakan html cache-control

Perhatikan bahwa ini hanya berlaku untuk halaman HTTP yang dilindungi password, yang menampilkan pop up login seperti ini:

Cara menggunakan html cache-control
Cara menggunakan html cache-control
Cara menggunakan html cache-control

403 Forbidden

Jika Anda tidak diizinkan untuk mengakses halaman, kode ini dapat dikirimkan ke browser Anda. Hal ini sering terjadi ketika Anda mencoba untuk membuka url untuk folder, yang tidak berisi halaman indeks. Jika pengaturan server tidak mengijinkann tampilan isi folder, Anda akan mendapatkan error 403.

Misalnya, di server lokal saya membuat sebuah folder gambar. Di dalam folder ini saya masukan file .htaccess dengan baris ini: "Options -Indexes". Sekarang ketika saya mencoba untuk membuka http://localhost/images/ - saya melihat ini:

Cara menggunakan html cache-control
Cara menggunakan html cache-control
Cara menggunakan html cache-control

Ada cara lain di mana akses dapat diblokir, dan 403 dapat dikirim. Misalnya, Anda dapat memblokir berdasarkan alamat IP, dengan bantuan beberapa arahan htaccess.

order allow,deny
deny from 192.168.44.201
deny from 224.39.163.12
deny from 172.16.7.92
allow from all

302 (atau 307) Moved Temporarily & 301 Moved Permanently

Dua kode ini yang digunakan untuk mengarahkan browser. Misalnya, ketika Anda menggunakan layanan pemendek url seperti bit.ly, itulah cara mereka meneruskan orang-orang yang mengklik link mereka.

Semua 302 dan 301 ditangani sangat mirip oleh browser, tetapi mereka dapat memiliki makna yang berbeda oleh spider dari mesin pencari. Misalnya, jika situs web Anda sedang down untuk pemeliharaan, Anda dapat mengarahkan ke lokasi lain menggunakan 302. Spider mesin pencari akan terus memeriksa halaman Anda nantinya di masa depan. Tapi jika Anda mengalihkan menggunakan 301, ia akan memberitahu spider bahwa situs web Anda telah pindah ke lokasi secara permanen. Untuk memberikan ide yang lebih baik: http://www.nettuts.com dialihkan ke https://net.tutsplus.com/ menggunakan kode 301 bukannya 302.

500 Internal Server Error

Cara menggunakan html cache-control
Cara menggunakan html cache-control
Cara menggunakan html cache-control

Kode ini biasanya terlihat ketika skrip web rusak. Kebanyakan skrip CGI tidak output kesalahan langsung ke browser, tidak seperti PHP. Jika ada kesalahan fatal, mereka hanya akan mengirim kode status 500. Dan programmer kemudian perlu mencari log kesalahan server untuk menemukan pesan kesalahan.

Daftar Lengkap

Anda dapat menemukan daftar lengkap kode status HTTP beserta penjelasan mereka di sini.

HTTP Header dalam Permintaan HTTP

Sekarang, kita akan meninjau beberapa dari HTTP header yang paling umum ditemukan dalam permintaan HTTP.

Hampir semua dari header ini dapat ditemukan di array $_SERVER dalam PHP. Anda juga dapat menggunakan fungsi getallheaders() untuk menerima semua header sekaligus.

Host

Permintaan HTTP dikirimkan ke Alamat IP tertentu. Tapi karena kebanyakan server mampu meng-hosting beberapa situs web di bawah IP yang sama, mereka harus tahu nama domain mana yang dicari browser.

Host: net.tutsplus.com

Ini pada dasarnya adalah nama host, termasuk domain dan subdomain.

Dalam PHP, hal ini dapat ditemukan sebagai $_SERVER['HTTP_HOST'] atau $_SERVER['SERVER_NAME'].

User-Agent

User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5 (.NET CLR 3.5.30729)

Header ini dapat membawa beberapa potongan informasi seperti:

  • Nama dan versi browser.
  • Nama dan versi Sistem Operasi.
  • Bahasa default.

Ini adalah bagaimana situs-situs dapat mengumpulkan beberapa informasi umum tentang pengunjung sistem mereka. Misalnya, mereka dapat mendeteksi jika pengunjung menggunakan browser ponsel dan mengarahkan mereka ke versi mobile dari situs web mereka yang bekerja lebih baik dengan resolusi rendah.

Dalam PHP, dapat ditemukan dengan: $_SERVER['HTTP_USER_AGENT'].

if ( strstr($_SERVER['HTTP_USER_AGENT'],'MSIE 6') ) {
  echo "Please stop using IE6!";
}

Accept-Language

Accept-Language: en-us,en;q=0.5

Header ini menampilkan pengaturan bahasa default dari pengguna. Jika sebuah situs web memiliki versi bahasa yang berbeda, hal ini dapat mengarahkan pengunjung baru berdasarkan data ini.

Itu bisa membawa berbagai bahasa, dipisahkan dengan koma. Yang pertama adalah bahasa pilihan, dan masing-masing bahasa terdaftar dapat membawa nilai "q", yang merupakan perkiraan dari preferensi pengguna untuk bahasa (min. 0 max. 1).

Dalam PHP, hal ini dapat ditemukan sebagai: $_SERVER["HTTP_ACCEPT_LANGUAGE"].

if (substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2) == 'fr') {
	header('Location: http://french.mydomain.com');
}

Accept-Encoding

Accept-Encoding: gzip,deflate

Sebagian besar browser modern mendukung gzip, dan akan mengirim ini di header. Web server kemudian dapat mengirim output HTML dalam format terkompresi. Hal ini dapat mengurangi ukuran hingga 80% untuk menghemat bandwidth dan waktu.

Dalam PHP, dapat ditemukan sebagai: $_SERVER["HTTP_ACCEPT_ENCODING"]. Namun, ketika Anda menggunakan fungsi panggilan balik ob_gzhandler(), itu akan memeriksa nilai ini secara otomatis, sehingga Anda tidak perlu melakukannya.

// enables output buffering
// and all output is compressed if the browser supports it
ob_start('ob_gzhandler');

If-Modified-Since

Jika sebuah dokumen web sudah di-cache di browser Anda, dan Anda mengunjunginya lagi, browser Anda dapat memeriksa apakah dokumen tersebut telah diperbarui dengan mengirimkan ini:

If-Modified-Since: Sat, 28 Nov 2009 06:38:19 GMT

Jika itu tidak diubah sejak tanggal tersebut, server akan mengirim kode respon "304 Not Modified", dan tidak ada konten - dan browser akan memuat konten dari cache.

Dalam PHP, dapat ditemukan sebagai: $_SERVER['HTTP_IF_MODIFIED_SINCE'].

// assume $last_modify_time was the last the output was updated

// did the browser send If-Modified-Since header?
if(isset($_SERVER['HTTP_IF_MODIFIED_SINCE'])) {

	// if the browser cache matches the modify time
	if ($last_modify_time == strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE'])) {

		// send a 304 header, and no content
		header("HTTP/1.1 304 Not Modified");
		exit;
	}

}

Ada juga HTTP header yang bernama Etag, yang dapat digunakan untuk memastikan cache adalah yang terbaru saat ini. Kita akan berbicara tentang hal ini segera.

Cookie

Seperti namanya, ini mengirimkan cookie yang disimpan di browser Anda untuk domain tersebut.

Cookie: PHPSESSID=r2t5uvjq435r4q7ib3vtdjq120; foo=bar

Ini adalah pasangan nama=nilai yang dipisahkan oleh titik koma. Cookie juga dapat berisi id sesi.

Dalam PHP, cookie individu dapat diakses dengan array $_COOKIE. Anda dapat langsung mengakses variabel sesi menggunakan array $_SESSION, dan jika Anda membutuhkan id sesi, Anda dapat menggunakan fungsi session_id() bukannya dari cookie.

echo $_COOKIE['foo'];
// output: bar
echo $_COOKIE['PHPSESSID'];
// output: r2t5uvjq435r4q7ib3vtdjq120
session_start();
echo session_id();
// output: r2t5uvjq435r4q7ib3vtdjq120

Referer

Seperti namanya, ini HTTP header yang berisi url perujuk.

Sebagai contoh, jika saya mengunjungi homepage Nettuts+, dan klik pada link artikel, header ini dikirim ke browser saya:

Referer: https://net.tutsplus.com/

Dalam PHP, dapat ditemukan sebagai $_SERVER['HTTP_REFERER'].

if (isset($_SERVER['HTTP_REFERER'])) {

	$url_info = parse_url($_SERVER['HTTP_REFERER']);

	// is the surfer coming from Google?
	if ($url_info['host'] == 'www.google.com') {

		parse_str($url_info['query'], $vars);

		echo "You searched on Google for this keyword: ". $vars['q'];

	}

}
// if the referring url was:
// http://www.google.com/search?source=ig&hl=en&rlz=&=&q=http+headers&aq=f&oq=&aqi=g-p1g9
// the output will be:
// You searched on Google for this keyword: http headers

Anda mungkin telah memperhatikan kata "referrer" salah eja sebagai "referer". Sayangnya itu dibuat menjadi spesifikasi HTTP resmi dan terjebak seperti itu.

Authorization

Ketika halaman web meminta otorisasi, browser akan membuka jendela login. Ketika Anda memasukkan username dan password pada jendela ini, browser mengirim permintaan HTTP lainnya, tapi kali ini berisi header ini.

Authorization: Basic bXl1c2VyOm15cGFzcw==

Data di dalam header adalah di-encode base64. Misalnya, base64_decode('bXl1c2VyOm15cGFzcw==') akan mengembalikan 'myuser:mypass'

Dalam PHP, nilai-nilai ini dapat ditemukan sebagai $_SERVER['PHP_AUTH_USER'] dan $_SERVER['PHP_AUTH_PW'].

Lebih lanjut tentang ini ketika kita berbicara tentang header WWW-Authenticate.

HTTP Header di Tanggapan HTTP

Sekarang kita akan melihat beberapa HTTP header yang paling umum ditemukan di tanggapan HTTP.

Di PHP, Anda dapat mengatur respon header menggunakan fungsi header(). PHP sudah mengirimkan header tertentu secara otomatis, untuk memuat konten dan pengaturan cookie dll... Anda dapat melihat header yang dikirimkan, atau yang akan dikirim, dengan fungsi headers_list(). Anda dapat memeriksa apakah header sudah dikirim, dengan fungsi headers_sent().

Cache-Control

Definisi dari w3.org: "Field header-umum Cache-Control digunakan untuk menentukan arahan yang HARUS dipatuhi oleh semua mekanisme caching seiring rangkaian permintaan/respon." "Mekanisme caching" ini termasuk gateway dan proxy yang mungkin digunakan ISP Anda.

Contoh:

Cache-Control: max-age=3600, public

"public" berarti bahwa respon dapat di-cache oleh siapa pun. "max-age" menunjukkan berapa detik cache berlaku untuknya. Mengijinkan situs web Anda akan di-cache dapat mengurangi beban dan bandwidth server, dan juga meningkatkan waktu load di browser.

Caching juga dapat dicegah dengan menggunakan direktif "no-cache".

Cache-Control: no-cache

Untuk info lebih rinci, lihat w3.org.

Content-Type

Header ini menunjukkan "mime-type" dari dokumen. Browser kemudian memutuskan bagaimana untuk menafsirkan konten berdasarkan ini. Sebagai contoh, sebuah halaman html (atau skrip PHP dengan output html) dapat mengembalikan ini:

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

"text" adalah jenisnya dan "html" adalah subtipe dari dokumen. Header juga bisa mengandung lebih banyak info seperti charset.

Untuk gambar gif, ini mungkin akan dikirim.

Content-Type: image/gif

Browser dapat memutuskan untuk menggunakan aplikasi eksternal atau ekstensi browser berdasarkan pada mime-type. Misalnya ini akan menyebabkan Adobe Reader untuk dapat dimuat:

Content-Type: application/pdf

Ketika me-loading langsung, Apache biasanya dapat mendeteksi mime-type dari dokumen dan mengirim header yang sesuai. Juga sebagian besar browser memiliki beberapa sejumlah toleransi kesalahan dan deteksi-otomatis dari mime-type, dalam kasus header yang salah atau tidak hadir.

Anda dapat menemukan daftar umum mime type di sini.

Di PHP, Anda dapat menggunakan fungsi finfo_file() untuk mendeteksi mime type dari file.

Content-Disposition

Header ini menginstruksikan browser untuk membuka kotak download file, bukannya mencoba untuk mengurai kandungannya. Contoh:

Content-Disposition: attachment; filename="download.zip"

Yang akan menyebabkan browser untuk melakukan hal ini:

Cara menggunakan html cache-control
Cara menggunakan html cache-control
Cara menggunakan html cache-control

Perhatikan bahwa header Content-Type yang sesuai juga akan dikirim bersama dengan ini:

Content-Type: application/zip
Content-Disposition: attachment; filename="download.zip"

Content-Length

Ketika konten akan dikirimkan ke browser, server dapat menunjukkan ukurannya (dalam byte) menggunakan header ini.

Content-Length: 89123

Ini terutama bermanfaat untuk download file. Itulah bagaimana browser dapat menentukan proses kemajuan dari download.

Sebagai contoh, berikut ini adalah skrip dummy yang saya tulis, yang mensimulasikan download lambat.

// it's a zip file
header('Content-Type: application/zip');
// 1 million bytes (about 1megabyte)
header('Content-Length: 1000000');
// load a download dialogue, and save it as download.zip
header('Content-Disposition: attachment; filename="download.zip"');

// 1000 times 1000 bytes of data
for ($i = 0; $i < 1000; $i++) {
	echo str_repeat(".",1000);

	// sleep to slow down the download
	usleep(50000);
}

Hasilnya adalah:

Cara menggunakan html cache-control
Cara menggunakan html cache-control
Cara menggunakan html cache-control

Sekarang saya akan memberi komentar ke header Content-Length

// it's a zip file
header('Content-Type: application/zip');
// the browser won't know the size
// header('Content-Length: 1000000');
// load a download dialogue, and save it as download.zip
header('Content-Disposition: attachment; filename="download.zip"');

// 1000 times 1000 bytes of data
for ($i = 0; $i < 1000; $i++) {
	echo str_repeat(".",1000);

	// sleep to slow down the download
	usleep(50000);
}

Sekarang hasilnya adalah:

Cara menggunakan html cache-control
Cara menggunakan html cache-control
Cara menggunakan html cache-control

Browser hanya dapat memberitahu Anda berapa banyak byte yang telah di-download, tetapi tidak tahu jumlah totalnya. Dan progress bar tidak menunjukkan proses kemajuan.

Etag

Ini adalah header yang digunakan untuk tujuan caching. Terlihat seperti ini:

Etag: "pub1259380237;gz"

Web server dapat mengirim header ini dengan setiap dokumen yang dilayaninya. Nilainya dapat didasarkan pada tanggal modifikasi terakhir, ukuran file, atau bahkan nilai checksum dari file. Browser kemudian menyimpan nilai ini sebagai cache dokumen. Lain waktu saat browser meminta file yang sama, ia akan mengirimkan ini dalam permintaan HTTP:

If-None-Match: "pub1259380237;gz"

Jika Etag nilai dokumen cocok dengannya, server akan mengirim kode 304 bukannya 200, dan tidak ada konten. Browser akan memuat konten dari cache.

Last-Modified

Seperti namanya, header ini menunjukkan tanggal modifikasi terakhir dari dokumen, di format GMT:

Last-Modified: Sat, 28 Nov 2009 03:50:37 GMT
$modify_time = filemtime($file);

header("Last-Modified: " . gmdate("D, d M Y H:i:s", $modify_time) . " GMT");

Ini menawarkan cara lain pada browser untuk cache dokumen. Browser dapat mengirim ini dalam permintaan HTTP:

If-Modified-Since: Sat, 28 Nov 2009 06:38:19 GMT

Kita sudah berbicara tentang ini sebelumnya di bagian "If-Modified-Since".

Location

Header ini digunakan untuk pengalihan. Jika kode respon 301 atau 302, server juga harus mengirim header ini. Misalnya, ketika Anda pergi ke http://www.nettuts.com browser Anda akan menerima ini:

HTTP/1.x 301 Moved Permanently
...
Location: https://net.tutsplus.com/
...

Di PHP, Anda dapat mengarahkan pengunjung seperti:

header('Location: https://net.tutsplus.com/');

Secara default, yang akan mengirimkan kode respon 302. Jika Anda ingin mengirim 301:

header('Location: https://net.tutsplus.com/', true, 301);

Set-Cookie

Ketika sebuah situs web yang ingin ditetapkan atau memperbarui cookie di browser Anda, itu akan menggunakan header ini.

Set-Cookie: skin=noskin; path=/; domain=.amazon.com; expires=Sun, 29-Nov-2009 21:42:28 GMT
Set-Cookie: session-id=120-7333518-8165026; path=/; domain=.amazon.com; expires=Sat Feb 27 08:00:00 2010 GMT

Setiap cookie yang dikirim sebagai header yang terpisah. Perhatikan bahwa cookie yang ditetapkan melalui JavaScript tidak pergi melalui HTTP header.

Di PHP, Anda dapat mengatur cookie menggunakan fungsi setcookie(), dan PHP akan mengirimkan HTTP header yang sesuai.

setcookie("TestCookie", "foobar");

Yang menyebabkan header ini dikirim:

Set-Cookie: TestCookie=foobar

Jika tanggal kadaluarsa tidak ditentukan, cookie akan dihapus ketika jendela browser ditutup.

WWW-Authenticate

Sebuah situs web dapat mengirimkan header ini untuk otentikasi pengguna melalui HTTP. Ketika browser melihat header ini, ia akan membuka jendela dialog login.

WWW-Authenticate: Basic realm="Restricted Area"

Yang terlihat seperti ini:

Cara menggunakan html cache-control
Cara menggunakan html cache-control
Cara menggunakan html cache-control

Ada bagian di manual PHP, yang memiliki sampel kode tentang cara untuk melakukan ini di PHP.

if (!isset($_SERVER['PHP_AUTH_USER'])) {
    header('WWW-Authenticate: Basic realm="My Realm"');
    header('HTTP/1.0 401 Unauthorized');
    echo 'Text to send if user hits Cancel button';
    exit;
} else {
    echo "<p>Hello {$_SERVER['PHP_AUTH_USER']}.</p>";
    echo "<p>You entered {$_SERVER['PHP_AUTH_PW']} as your password.</p>";
}

Content-Encoding

Header ini biasanya ditetapkan ketika konten yang dikembalikan adalah dikompresi.

Content-Encoding: gzip

Dalam PHP, jika Anda menggunakan fungsi panggilan balik ob_gzhandler(), maka akan diatur secara otomatis untuk Anda.

Kesimpulan

Terima kasih telah membaca. Saya harap artikel ini adalah titik awal yang baik untuk belajar tentang Header HTTP. Silakan meninggalkan komentar dan pertanyaan di bawah, dan saya akan mencoba untuk menjawab sebanyak yang saya bisa.