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.Ada dua cara yang dapat Anda lakukan, pertama dengan cara manual (saya lebih merekomendasi ini); kemudian yang kedua dengan cara praktis, menggunakan sejenis tool converter.
Sebetulnya artikel ini adalah artikel lanjutan dari artikel linuxku.com yang sebelumnya yakni:
http://www.linuxku.com/2016/05/mengatur-nginx-agar-bisa-menggunakan.html
Di sini penulis memberikan tulisan lebih kepada prakteknya.
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 ^profile/(.*)$ index.php?username=$1 [L]Kita pelajari dahulu yakni, setiap kita request di browser dengan
/profile/nama_profile_nya
itu artinya sama saja kita me-request pada /index.php?profile=$1
. Dan jika yang di-request tersebut ternyata adalah sebuah berkas atau direktori, maka arahkan langsung ke berkas dan direktori tersebut.Nah untuk mengkonversi ke Nginx caranya sangat simpel yakni:
root /srv/http/shop; index index.php index.html index.htm; location / { autoindex on; } location /barang { if (!-f $request_filename) { rewrite ^/profile/(.*)$ /index.php?profile=$1; } }
Penjelasan SkripPada skrip di atas kita melihat
root
dengan nilai /srv/http/shop
. Artinya skrip tersebut hanya berlaku pada skrip PHP yang terletak pada direktori /srv/http/shop
. Jadi jika Anda akses localhost hal itu langsung ke direktori tersebut.Lalu bagaimana jika ingin mengaksesnya dari subdirektori seperti
http://localhost/shop
? Untuk melakukan hal itu cukup mudah, tinggal Anda rubah saja skrip di atas menjadi seperti berikut:root /srv/http; location /shop/profile { if (!-f $request_filename) { rewrite ^/shop/profile/(.*)$ shop/index.php?profile=$1; } }Dengan mengganti
root
direktori ke /srv/http
dan menambahkan _localtion_nya dengan /shop/
. 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 skriplocation /shop/profile { if (!-f $request_filename) { rewrite ^/shop/profile/(.*)$ /index.php?profile=$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 ?profile=
Mudah bukan?
Studi Kasus Redirect
Lanjut ke contoh kasus redirect. Katakanlah Anda ingin semua domain Anda yang tanpa www
di-redirect-kan ke www.linuxku.com
. Contoh pada .htaccess
seperti skrip berikut:RewriteEngine on RewriteCond %{HTTP_HOST} ^linuxku.com [NC] RewriteRule ^(.*)$ http://www.linuxku.com/$1 [L,R=301,NC]Maka cukup kita terjemahkan ke pengaturan Nginx sebagai berikut:
server { listen 80; server_name linuxku.com; return 301 http://www.linuxku.com$request_uri; } server { listen 80; server_name www.linuxku.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
.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:http://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
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; }
Cara Praktis
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:http://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 ??
Website ini menganut paham demokrasi wkwk
Jangan lupa gunakan emot biar akrab gan (/ ^.^)/
EmoticonEmoticon