Konversi .htaccess di Nginx


Bagi Anda pengguna Apache, mungkin sudah kenal dan familiar dengan berkas .htaccess yang mana salah satu fungsinya adalah membuat pretty URL atau menghilangkan index.php dari URL di peramban. Pada saat saya migrasi dari Apache ke Nginx, saya sedikit mengalami kendala yakni salah satunya mengenai berkas .htaccess ini. Ya, seperti yang telah kita ketahui bahwa .htaccess hanya didesin untuk pengguna Apache. Jadi bagi pengguna Nginx .htaccess ini tidaklah berfungsi sama sekali.

Untuk mengantisipasi hal tersebut, kita harus mengkonversi .htaccess ke dalam berkas konfigurasi di setiap virtual host pada Nginx. Pada artikel kali ini, saya akan membahas mengenai hal tersebut dengan beberapa cara yang saya lakukan selama menggunakan Nginx pada VPS situsali.com ini.

Ada dua cara yang dapat Anda lakukan, pertama dengan cara manual (saya lebih merekomendasi ini); kemudian yang kedua dengan cara otomatis, menggunakan sejenis tool converter.

Metode Manual

Studi Kasus Pretty URL

Kita asumsikan dahulu misalnya di .htaccess dari Web seperti berikut:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^barang/(.*)$ index.php?barang=$1 [L]

Kita terjemahkan dahulu yakni, setiap kita request di peramban dengan /barang/nama_barang_nya itu artinya sama saja kita me-request pada /index.php?barang=$1. Dan jika yang di-request tersebut ternyata adalah sebuah berkas atau direktori, maka arahkan langsung ke berkas dan direktori tersebut.

Gambaranya seperti berikut:

Apache

Nah untuk mengkonversi ke Nginx caranya sangat simpel yakni:

root   /srv/http/tokoku;
index index.php index.html index.htm;
 
location / {
     autoindex on;
}
 
location /barang {
    if (!-f $request_filename) {
         rewrite ^/barang/(.*)$ /index.php?barang=$1;
    }
}

Penjelasan Skrip

Pada skrip di atas kita melihat root dengan nilai /srv/http/tokoku. Artinya skrip tersebut hanya berlaku pada skrip PHP yang terletak pada direktori /srv/http/tokoku. Jadi jika Anda akses localhost hal itu langsung ke direktori tersebut. Seperti gambar di bawah ini:

Nginx

Lalu bagaimana jika ingin seperti Apache di atas (pada screenshot di atas) ? Yang mana kita mengaksesnya dari subdirektori https://localhost/tokoku ? Untuk melakukan hal itu cukup mudah, tinggal Anda rubah saja skrip di atas menjadi seperti berikut:

root   /srv/http;
 
location /tokoku/barang {
    if (!-f $request_filename) {
         rewrite ^/tokoku/barang/(.*)$ tokoku/index.php?barang=$1;
    }
}

Dengan mengganti root direktori ke /srv/http dan menambahkan _localtion_nya dengan /tokoku/. Kemudian perhatikan kembali skrip awal. Kita melihat adanya skrip:

location / {
     autoindex on;
}

Itu artinya di setiap root jika ada direktori maka tampilkanlah sebagai direktori (Directory Listing). Kemudian skrip:

location /barang {
    if (!-f $request_filename) {
         rewrite ^/barang/(.*)$ /index.php?barang=$1;
    }
}

Kita melihat adanya if (!-f $request_filename) ini artinya kita cek terlebih dahulu apakah request dari peramban /barang itu berupa argumen atau direktori? Jika berupa argumen maka kita panggil argumen ?barang=.

Mudah bukan?

Studi Kasus Redirect

Lanjut ke contoh kasus redirect. Katakanlah Anda ingin semua domain Anda yang tanpa www di-redirect-kan ke www.domainAnda.com. Contoh pada .htaccess seperti skrip berikut:

RewriteEngine on
RewriteCond %{HTTP_HOST} ^domainku.com [NC]
RewriteRule ^(.*)$ https://www.domainku.com/$1 [L,R=301,NC]

Maka cukup kita terjemahkan ke pengaturan Nginx sebagai berikut:

server {
    listen      80;
    server_name domainku.com;
    return      301 https://www.domainku.com$request_uri;
}
 
server {
    listen      80;
    server_name www.domainku.com;
}

Penjelasan Skrip

Kita menggunakan dua buah class server yang mana kedua class tersebut memanggil port 80. Jika dalam port tersebut ada yg me-request domain tanpa www, maka kita beri kode return 301 yang artinya memaksa requester untuk masuk harus dengan domain dengan www.

Studi Kasus pada Drupal

Sekarang kita masuk ke salah satu CMS (Content Management System) yakni Drupal. Kita melihat berkas .htaccess nya sebagai berikut:

<FilesMatch "\.(engine|inc|info|install|make|module|profile|test|po|sh|.*sql|theme|tpl(\.php)?|xtmpl)$|^(\..*|Entries.*|Repository|Root|Tag|Template)$">
    Order allow,deny
</FilesMatch>
 
RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !=/favicon.ico
RewriteRule ^ index.php [L]

Sebelum diterjemahkan ke pengaturan Nginx pahami dahulu .htaccess di atas. Pada awal skrip tertulis semua berkas yang mengandung kata engine,inc,info dan sebagainya kita tidak boleh mengaksesnya (deny). Dan skrip di bawahnya itu standar dan mudah yakni hanya menghilangkan index.php dari URL pada peramban.

Untuk terjemahan ke Nginx adalah sebagai berikut:

location ~* \.(engine|inc|info|install|make|module|profile|test|po|sh|.*sql|theme|tpl(\.php)?|xtmpl)$ {
    deny all;
}
 
location ~* ^/(\..*|Entries.*|Repository|Root|Tag|Template)$ {
    deny all;
}
 
location / {
    try_files $uri /index.php$is_args$args;
 
    ## Cara lainnya:
    #if (!-f $request_filename) {
    #   rewrite ^(.*)$ /index.php;
    #}
}
 
location /favicon.ico {
}

Penjelasan Skrip

Hampir sama dengan skrip sebelumnya dan jika kita perhatikan masih mirip dengan Regex dari .htaccess. Yakni untuk beberapa berkas yang mengandung kata engine,inc,info dan sebagainya kita blokir. Langsung saja saya asumsikan Anda sudah mengerti karena kasusnya mirip dengan skrip sebelumnya. Kita lanjut dengan melihat skrip berikut di bawah:

location / {
    try_files $uri /index.php$is_args$args;
 
    ## Cara lainnya:
    #if (!-f $request_filename) {
    #   rewrite ^(.*)$ /index.php;
    #}
}

Dalam root direktori terdapat try_files. Ini artinya Nginx mencoba menerjemahkan jika isi dari variabel $uri maka terjemahkan ke dalam argumen yang diambil dari global variable $_GET. Untuk mengetahui variabel-variabel Nginx Anda bisa mempelajari dari tautan di bawah ini:

https://nginx.org/en/docs/http/ngx_http_core_module.html#variables

Studi Kasus pada Joomla

Sekarang kita beralih ke Joomla. Kita lihat dahulu berkas .htaccess nya yakni:

RewriteBase /
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteCond %{REQUEST_URI} !^/index\.php
RewriteCond %{REQUEST_URI} /component/|(/[^.]*|\.(php|html?|feed|pdf|vcf|raw))$ [NC]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .* index.php [L]

Jika diperhatikan skrip di atas akan sangat sederhana untuk kita terjemahkan ke pengaturan Nginx, yakni cukup:

location / {
    try_files $uri /index.php$is_args$args;
}

Penjelasan Skrip

Mengapa skrip terjemahan atau konversinya hanya sedikit? Sedangkan kita melihat dari .htaccess di atas skripnya lebih banyak? Kita mengabaikan skrip pada baris ke-2 dan ke-4 karena dasarnya dengan skrip try_files kita sudah dapat melakukan hal itu.

Studi Kasus pada WordPress

Nah ini yang paling penting bagi Anda pengguna CMS WordPress dan memang WordPress ini CMS yang palingan banyak digunakan dalam pembuatan situs, dan situsali.com juga menggunakan WordPress, dan saya juga pengguna Nginx dalam VPS situs ini.

Kita melihat .htaccess pada WP sangatlah sederhana yakni hanya menghilangkan index.php saja. Adapun skrip .htaccess nya adalah sebagai berikut:

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]

Terlihat sangat mudah untuk kita terjemahkan ke Nginx, cukup gunakan try_files saja. Adapun skripnya sama seperti skrip yang dilakukan pada Joomla, yakni:

location / {
    try_files $uri /index.php$is_args$args;
}

Penjelasan Skrip

Tidak perlu ada penjelasan dalam skrip WP, karena dasarnya sama seperti skrip-skrip di atas.

Metode Otomatis

Jika Anda masih kesulitan menerjemahkan .htaccess ke Nginx karena beberapa faktor seperti kurangnya pengetahuan tentang .htaccess (mungkin ini akan saya bahas pada artikel selanjutnya); dan masalah Regex. Tidak perlu khawatir, Anda dapat menggunakan tool, yakni:

https://winginx.com/en/htaccess

Dengan tool di atas, kita tidak perlu repot lagi menerjemahkan .htaccess karena secara otomatis tool di atas dapat melakukannya. Akan tetapi, yang saya tekankan di sini adalah, bahwa tool di atas tidak ada jaminan dapat 100% kompatibel dengan Nginx, ada kiranya Anda tes terlebih dahulu sebelum menggunakannya. Juga skrip di atas kita harus online dalam mengaksesnya, maka dari awal pembahasan saya merekomendasikan gunakan cara manual.

Semoga tulisan ini bermafaat 😉

Sumber