[htaccess] Menghilangkan ekstensi .php di URL?

Mumpung lagi menjalankan Apache, saya akan share bagaimana seharusnya rule yang dipakai untuk rewrite URL.

Cara semacam ini mungkin yang paling umum atau banyak ditemukan di tutorial-tutorial:

  1. RewriteEngine On 
  2. RewriteCond %{REQUEST_FILENAME} !-f 
  3. RewriteCond %{REQUEST_FILENAME} !-d 
  4. RewriteRule ^(.*)$ $1.php [L] 

Lihat pada bagian pola RewriteRule, (.*) akan menangkap "apapun" dan akan menaruh apapun ke bagian target $1.

Sehingga request yang mengarah ke /apapun akan diarahkan ke /apapun.php.

Cara tersebut menurut saya kurang legit karena jika kita buat request ke /apapun/ (ada slash di belakang), akan 500 Internal Server Error!

Solusinya bisa kita ubah polanya menjadi ([^/]+)/? yang artinya bahwa "apapun selain slash, yang tidak atau diikuti dengan slash".

  1. RewriteEngine On 
  2. RewriteCond %{REQUEST_FILENAME} !-f 
  3. RewriteCond %{REQUEST_FILENAME} !-d 
  4. RewriteRule ^([^/]+)/?$ $1.php [L] 

Mungkin cara diatas cukup? Akan tetapi masih bisa kita kembangkan lagi agar lebih fleksibel. Misal kita ingin agar request ke /apapun, /apapun////, /apapun.html, /apapun.apapun tetap mengarah ke /apapun.php, maka polanya bisa kita ubah menjadi ([^/\.]+).* yang artinya bahwa "apapun selain slash maupun titik yang diikuti dengan apapun".

Saya juga biasa menambahkan QSA agar bisa menangkap QUERY_STRING meskipun sudah di-rewrite, misal /apapun.html?id=1.

  1. RewriteEngine On 
  2. RewriteCond %{REQUEST_FILENAME} !-f 
  3. RewriteCond %{REQUEST_FILENAME} !-d 
  4. RewriteRule ^([^/\.]+).*$ $1.php [QSA,L]