Pengaturan subdomain dan permalink sejatinya dilakukan di apache2.conf. Pengaturan subdomain dan permalink yang dilakukan di htacess digunakan jika dan hanya jika admin tidak memiliki hak untuk menulis konfigurasi di folder /etc/apache2.
Daftar Isi
Mengapa di apache2.conf, tidak di htaccess?
Jika Anda mampu menulis di /etc/apache2, maka sebaiknya tidak menggunakan htaccess
— Lebih Baik apache2.conf Daripada htaccess
htaccess dibaca di diska, sedangkan pengaturan di /etc/apache2 dibaca di RAM sehingga prosesnya akan lebih cepat. Selain itu, faktor keamanan menjadi pertimbangan lain.
|-Area Keamanan
- Aktifkan HTTPS
a2ensite 000-default-ssl
(https://pdsi.unisayogya.ac.id/lebih-baik-apache2-conf-daripada-htaccess/#langkah) - Hanya mengeksekusi skrip PHP yang berada di dalam berkas *.php
<FilesMatch ".php$">…</FilesMatch>
(https://pdsi.unisayogya.ac.id/lebih-baik-apache2-conf-daripada-htaccess/#langkah)/etc/php/7.0/fpm/pool.d
(https://pdsi.unisayogya.ac.id/move-on-mpm-prefork-ke-mpm-event-sebuah-catatan/#server-sendiri) - Tidak mengeksekusi skrip PHP yang berada di dalam folder cegah eksekusi php dari folder (1) upload dan cache di mana di dalamnya tidak ada file php sama sekali, misalnya wp-content/uploads dan wp-content/cache, (2) tema dan plugin meskipun ada file php tapi sifatnya hanya hook
ProxyPassMatch ^(.*((/tmp-php)|(wp-content/uploads/)|(wp-content/cache/)|(wp-content/)))(.*\.php(/.*)?)$
(https://pdsi.unisayogya.ac.id/lebih-baik-apache2-conf-daripada-htaccess/#langkah) - Cegah eksekusi skrip
#Prevent script execution: (1) -ExecCGI, (2) folder temporary php dan folder upload di mount dengan mode=1777 dan noexec
#Alias ...."/tmp-php"
<Directory "/tmp-php">
Options -ExecCGI
AddHandler cgi-script .php .pl .py .jsp .asp .htm .html
</Directory> - Hanya PHP-FPM yang bisa membaca dan mengeksekusi berkas PHP sesuai dengan user masing-masing
addgroup
,adduser
,chown user:guser -R
,chmod 0711
,chmod 0600
,listen.owner
,listen.group
,listen.mode
(https://pdsi.unisayogya.ac.id/move-on-mpm-prefork-ke-mpm-event-sebuah-catatan/#server-sendiri) - Berkas dalam mode hanya baca
chmod 0600
,attr +i
(https://pdsi.unisayogya.ac.id/move-on-mpm-prefork-ke-mpm-event-sebuah-catatan/#server-sendiri) - Isolasi (chroot)
php_admin_value[open_basedir]
(https://pdsi.unisayogya.ac.id/move-on-mpm-prefork-ke-mpm-event-sebuah-catatan/#server-sendiri)ForceCommand internal-sftp -d
ChrootDirectory
(https://pdsi.unisayogya.ac.id/move-on-mpm-prefork-ke-mpm-event-sebuah-catatan/#sftp-only) - Amankan upload
(https://pdsi.unisayogya.ac.id/move-on-mpm-prefork-ke-mpm-event-sebuah-catatan/3/#amankan-upload)
|-Ide
- Apabila ada permintaan HTTP, maka:
- dijalankan /etc/apache2/sites-enabled/000-default.conf
- apabila permintaan masuk dalam daftar /etc/apache2/include/sub-domain-http.conf, maka tetap di HTTP, selain itu akan dialihkan ke HTTPS
- Apabila ada permintaan HTTPS, maka dijalankan /etc/apache2/sites-enabled/000-default-ssl.conf. Ganti nama default-ssl.conf menjadi 000-default-ssl.conf.
|-Langkah
Materi ini terkait dengan: https://pdsi.unisayogya.ac.id/move-on-mpm-prefork-ke-mpm-event-sebuah-catatan/. Baca juga Unsecret Tai Chi Techniques on Apache2 and PHP FPM: UNISA Yogyakarta Style.
- Pastikan bahwa subdomain umum untuk http dan https diberi nama dengan awalan 000,
- misal
000-default.conf
dan000-default-ssl.conf
, karena apache2 akan membaca sites-enabled sesuai urutan abjad. Jalankan perintahsu
ls /etc/apache2/sites-available/000-*.conf - Jika belum menggunakan nama 000 di depannya, misalnya
default.conf
ataudefault-ssl.conf
, maka jalankan
a2dissite default
mv /etc/apache2/sites-available/default.conf /etc/apache2/sites-available/000-default.conf
a2ensite 000-default
a2dissite default-ssl
mv /etc/apache2/sites-available/default-ssl.conf /etc/apache2/sites-available/000-default-ssl.conf
a2ensite 000-default-ssl
service apache2 restart
- misal
- Buat folder include
su
mkdir /etc/apache2/include - Beri komentar dengan tanda pagar (#) pada semua AllowOverride All di berkas /etc/apache2/apache2.conf
#AllowOverride All
misalnya menjadi seperti di bawah ini<Directory />
Options FollowSymLinks
AllowOverride None
#AllowOverride All
Require all denied
</Directory>
<Directory /usr/share>
AllowOverride None
Require all granted
</Directory>
<Directory /var/www/>
Options FollowSymLinks
AllowOverride None
#AllowOverride All
Require all granted
</Directory> - Tambahkan pada /etc/apache2/sites-enabled/000-default.conf (dan/atau situs lain)
<VirtualHost _default_:80>
<Directory "/var/www">
Include include/sub-domain-http.conf
Include include/wordpress.conf
Include include/force-https.conf
</Directory>
#tambahkan setting lain di bawah ini
#...
</VirtualHost> - Tambahkan pada /etc/apache2/sites-enabled/000-default-ssl.conf
<VirtualHost _default_:443>
#setting semua (general)
<Directory "/var/www">
Include include/sub-domain.conf
Include include/wordpress.conf
</Directory>
#setting yang tidak sama dengan general ditulis di bawah ini
#setting multisite 1
<Directory "/var/www/subdomainms1">
Include include/wordpress-multisite.conf
</Directory>
#setting multisite 2
<Directory "/var/www/subdomainms2">
Include include/wordpress-multisite.conf
</Directory>
Include include/ssl.conf
#tambahkan setting lain di bawah ini
#...
</VirtualHost> - Tambahkan pada situs/virtual host lain (dan/atau situs lain)
<VirtualHost _default_:443>
DocumentRoot /var/non-www/vhost1/virtualhost1
ServerName virtualhost1.example.org
<Directory "/var/non-www/vhost1/virtualhost1">
#pengaman path traversal
RewriteCond %{REQUEST_URI} (?:%252E%252E%252F)
RewriteRule .* trap.html [L]
RewriteCond %{QUERY_STRING} (?:%252E%252E%252F)
RewriteRule .* trap.html [L]
RewriteCond %{REQUEST_URI} (?:\.\./)
RewriteRule .* trap.html [L]
RewriteCond %{QUERY_STRING} (?:\.\./)
RewriteRule .* trap.html [L]
#pengalihan method yang tidak digunakan ke halaman Forbidden RewriteCond %{REQUEST_METHOD} ^(PUT|DELETE|PATCH|TRACK|OPTIONS) RewriteRule .* - [F]
#setting
Options FollowSymLinks
AllowOverride None
Require all granted
#jika wordpress gunakan include/wordpress.conf
Include include/nonwordpress.conf
</Directory>
Include include/ssl.conf
#Prevent script execution: (1) -ExecCGI, (2) folder temporary php dan folder upload di mount dengan mode=1777 dan noexec
<Directory "/tmp-php">
Options -ExecCGI
AddHandler cgi-script .php .pl .py .jsp .asp .htm .html
</Directory>
#keamanan: cegah eksekusi php dari folder cegah eksekusi php dari folder (1) upload dan cache di mana di dalamnya tidak ada file php sama sekali, misalnya wp-content/uploads dan wp-content/cache, (2) tema dan plugin meskipun ada file php tapi sifatnya hanya hook
ProxyPassMatch ^(.*((/tmp-php)|(wp-content/uploads/)|(wp-content-cache/)|(wp-content/)))(.*\.php(/.*)?)$ unix:/run/php/php7.0-fpm-pool1-forbid.sock|fcgi://localhost/var/non-www/vhost1/virtualhost1-forbid timeout=1ms
#ok, biarkan PHP-FPM lakukan pekerjaannya, ekstensi selain php tidak dieksekusi meskipun terdapat skrip php di dalamnya
<FilesMatch ".php$">
<If "-f %{REQUEST_FILENAME}">
SetHandler "proxy:unix:/run/php/php7.0-fpm-pool1|fcgi://localhost/"
</If>
</FilesMatch>
#tambahkan setting lain di bawah ini
#...
</VirtualHost> - Lakukan pengaturan sub-domain dan permalink
- Periksa konfigurasi setelah melakukan semua pengaturan
apachectl configtest
- Jalankan kembali apache2 apabila tidak ada kesalahan
service apache2 restart
|-Konfigurasi Sub-Domain
Aturan dapat dicek di https://htaccess.madewithlove.be/ atau https://technicalseo.com/tools/htaccess/
|–HTTP
HTTP sekarang sudah jarang sekali ada, tetapi mungkin ada suatu kasus yang membutuhkan HTTP, bukan HTTPS. Apabila ada sub-domain yang hanya HTTP, maka perlu dinegasikan di berkas force-https.
#berkas /etc/apache2/include/sub-domain-http.conf
#mungkin berkas ini kosong
RewriteEngine On
RewriteCond %{HTTP_HOST} subdomainhttp.example.org
RewriteCond %{REQUEST_URI} !^/subdomainhttp
RewriteRule ^(.*)$ subdomainhttp/$1 [L]
|–Force HTTPS
Apabila ada permintaan yang melalui HTTP, tetapi tidak tersaring di sub-domain-http.conf, maka akan dipaksa melalui HTTPS
#berkas /etc/apache2/include/force-https.conf
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteCond %{SERVER_PORT} ^80$
RewriteCond %{HTTP_HOST} !subdomainhttp.example.org
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [L,R=301,R=permanent]
|–HTTPS
#berkas /etc/apache2/include/sub-domain.conf
RewriteEngine On
#example.org ke www.example.org
RewriteCond %{HTTP_HOST} ^example.org
RewriteRule (.*) https://www.example.org/$1 [L]
#subdomain 1 (wordpress)
RewriteCond %{HTTP_HOST} subdomain1.example.org
RewriteCond %{REQUEST_URI} !^/subdomainwp1
RewriteRule ^(.*) subdomainwp1/$1 [L]
#subdomain 2 (wordpress)
RewriteCond %{HTTP_HOST} subdomain2.example.org
RewriteCond %{REQUEST_URI} !^/subdomainwp2
RewriteRule ^(.*) subdomainwp2/$1 [L]
#subdomain 3 (non wordpress)
RewriteCond %{HTTP_HOST} subdomain3.example.org
RewriteCond %{REQUEST_URI} !^/subdomainnonwp
RewriteRule ^(.*) subdomainnonwp/$1 [L]
#subdomain 4 (wordpress multisite)
RewriteCond %{HTTP_HOST} subdomainmultisite1.example.org
RewriteCond %{REQUEST_URI} !^/subdomainms1
RewriteRule ^(.*) subdomainms1/$1 [L]
#subdomain 5 (wordpress multisite)
RewriteCond %{HTTP_HOST} subdomainmultisite2.example.org
RewriteCond %{REQUEST_URI} !^/subdomainms2
RewriteRule ^(.*) subdomainms2/$1 [L]
#subdomain 6, redirect
RewriteCond %{HTTP_HOST} subdomainredirect.example.org
RewriteRule ^(.*)$ https://www.example.com/$1 [R=301,END]
#virtual host lain tidak disertakan
#virtual host lain buat konfigurasi sendiri
Subdomain 1 sampai 3 di atas menggunakan pengaturan wordpress.conf, sedangkan subdomain 4 dan 5 menggunakan pengaturan wordpress-multisite.conf. Subdomain 6 tidak terpengaruh dengan pengaturan karena redirect ke tempat lain.
|-Konfigurasi Permalink
Berikut adalah contoh dua pengaturan untuk dua model permalink. Apabila ada model lain, maka dapat dibuatkan berkas baru.
|–WordPress / General
Pengaturan ini dapat digunakan untuk WordPress maupun situs lain yang memiliki permalink sama dengan WordPress.
#berkas /etc/apache2/include/wordpress.conf
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress
|–Multisite WordPress
#berkas /etc/apache2/include/wordpress-multisite.conf
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
# add a trailing slash to /wp-admin
RewriteRule ^([_0-9a-zA-Z-]+/)?wp-admin$ $1wp-admin/ [R=301,L]
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]
RewriteRule ^([_0-9a-zA-Z-]+/)?(wp-(content|admin|includes).*) $2 [L]
RewriteRule ^([_0-9a-zA-Z-]+/)?(.*\.php)$ $2 [L]
RewriteRule . index.php [L]
</IfModule>
|–Non WordPress
#berkas /etc/apache2/include/nonwordpress.conf
RewriteEngine on
RewriteCond %{THE_REQUEST} /([^.]+)\.php [NC]
RewriteRule ^ /%1 [NC,L,R]
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^ %{REQUEST_URI}.php [NC,L]
|-Pengujian
Jalankan apachectl -S
Mencari htaccess
Apabila sebelumnya menggunakan htaccess, maka dapat diinventarisir folder-folder mana yang menggunakan htaccess
cd /var/www
sudo find . -type f -name ".htaccess" > hasilscan
sudo nano hasilscan
Demikian, semoga bermanfaat. [bst]
Sumber:
2 replies on “Lebih Baik apache2.conf Daripada htaccess”
[…] Materi ini terkait dengan: https://pdsi.unisayogya.ac.id/lebih-baik-apache2-conf-daripada-htaccess/ […]
[…] https://pdsi.unisayogya.ac.id/lebih-baik-apache2-conf-daripada-htaccess/ […]