Untuk memahami apa yang mod_rewrite lakukan, pertama-tama Anda perlu memahami cara kerja server web. Server web merespons permintaan HTTP . Permintaan HTTP di tingkat paling dasar terlihat seperti ini:
GET /foo/bar.html HTTP/1.1
Ini adalah permintaan sederhana dari browser ke server web yang meminta URL /foo/bar.html
darinya. Penting untuk ditekankan bahwa itu tidak meminta file , hanya meminta beberapa URL sewenang-wenang. Permintaan juga dapat terlihat seperti ini:
GET /foo/bar?baz=42 HTTP/1.1
Ini sama validnya dengan permintaan untuk URL, dan jelas tidak ada hubungannya dengan file.
Server web adalah aplikasi yang mendengarkan pada port, menerima permintaan HTTP yang masuk pada port itu dan mengembalikan respons. Server web sepenuhnya bebas untuk menanggapi permintaan apa pun yang menurutnya sesuai / dengan cara apa pun yang telah Anda konfigurasikan untuk merespons. Respons ini bukan file, ini respons HTTP yang mungkin atau mungkin tidak ada hubungannya dengan file fisik pada disk apa pun. Server web tidak harus Apache, ada banyak server web lain yang semuanya hanya program yang berjalan terus-menerus dan dilampirkan ke port yang merespons permintaan HTTP. Anda dapat menulis sendiri. Paragraf ini dimaksudkan untuk menceraikan Anda dari anggapan bahwa URL secara langsung menyamakan file, yang sangat penting untuk dipahami. :)
Konfigurasi default sebagian besar server web adalah mencari file yang cocok dengan URL pada hard disk. Jika akar dokumen server diatur ke, katakanlah, /var/www
mungkin terlihat apakah file tersebut /var/www/foo/bar.html
ada dan sajikan jika demikian. Jika file berakhir dengan ".php" itu akan memanggil penerjemah PHP dan kemudian mengembalikan hasilnya. Semua asosiasi ini sepenuhnya dapat dikonfigurasi; file tidak harus diakhiri dengan ".php" agar server web dapat menjalankannya melalui penerjemah PHP, dan URL tidak harus mencocokkan file tertentu pada disk untuk sesuatu terjadi.
mod_rewrite adalah cara untuk menulis ulang penanganan permintaan internal. Ketika server web menerima permintaan untuk URL /foo/bar
, Anda dapat menulis ulang URL itu menjadi sesuatu yang lain sebelum server web akan mencari file pada disk untuk mencocokkannya. Contoh sederhana:
RewriteEngine On
RewriteRule /foo/bar /foo/baz
Aturan ini mengatakan kapan saja permintaan cocok dengan "/ foo / bar", tulis ulang menjadi "/ foo / baz". Permintaan kemudian akan ditangani seolah-olah /foo/baz
telah diminta sebagai gantinya. Ini dapat digunakan untuk berbagai efek, misalnya:
RewriteRule (.*) $1.html
Aturan ini cocok dengan apa pun ( .*
) dan menangkapnya ( (..)
), lalu menulis ulang untuk menambahkan ".html". Dengan kata lain, jika /foo/bar
URL yang diminta, itu akan ditangani seolah-olah /foo/bar.html
telah diminta. Lihat http://regular-expressions.info untuk informasi lebih lanjut tentang pencocokan ekspresi reguler, penangkapan, dan penggantian.
Aturan lain yang sering ditemui adalah ini:
RewriteRule (.*) index.php?url=$1
Ini, sekali lagi, cocok dengan apa pun dan menulis ulang ke file index.php dengan URL yang awalnya diminta ditambahkan dalam url
parameter kueri. Yaitu, untuk setiap dan semua permintaan yang masuk, file index.php dieksekusi dan file ini akan memiliki akses ke permintaan asli $_GET['url']
, sehingga dapat melakukan apa pun yang diinginkan.
Terutama Anda memasukkan aturan penulisan ulang ini ke file konfigurasi server web Anda . Apache juga memungkinkan Anda untuk meletakkannya di file yang disebut di .htaccess
dalam root dokumen Anda (yaitu di sebelah file .php Anda).
* Jika diizinkan oleh file konfigurasi Apache utama; itu opsional, tetapi sering diaktifkan.
Apa yang tidak dilakukan mod_rewrite
mod_rewrite tidak secara ajaib membuat semua URL Anda "cantik". Ini adalah kesalahpahaman umum. Jika Anda memiliki tautan ini di situs web Anda:
<a href="https://stackoverflow.com/my/ugly/link.php?is=not&very=pretty">
tidak ada yang bisa dilakukan mod_rewrite untuk membuatnya cantik. Untuk menjadikan ini tautan yang cantik, Anda harus:
Ubah tautan ke tautan yang cantik:
<a href="https://stackoverflow.com/my/pretty/link">
Gunakan mod_rewrite di server untuk menangani permintaan ke URL /my/pretty/link
menggunakan salah satu metode yang dijelaskan di atas.
(Orang dapat menggunakan mod_substitute
bersama-sama untuk mengubah halaman HTML keluar dan tautannya yang terkandung. Meskipun ini biasanya lebih banyak upaya daripada hanya memperbarui sumber daya HTML Anda.)
Ada banyak yang dapat dilakukan mod_rewrite dan aturan pencocokan yang sangat rumit yang dapat Anda buat, termasuk merantai beberapa penulisan ulang, memproksi permintaan ke layanan atau mesin yang sama sekali berbeda, mengembalikan kode status HTTP tertentu sebagai tanggapan, mengarahkan permintaan, dll. Ini sangat kuat dan dapat digunakan untuk Sangat bagus jika Anda memahami mekanisme permintaan-respons HTTP mendasar. Itu tidak secara otomatis membuat tautan Anda cantik.
Lihat dokumentasi resmi untuk semua kemungkinan bendera dan opsi.