Categories
Tutorial, Manual, Tips dan Trik

Lebih Baik apache2.conf Daripada htaccess

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
htaccess dibaca di diska, sedangkan pengaturan di /etc/apache2 dibaca di RAM sehingga prosesnya akan lebih cepat. Selain itu, faktor keamanan menjadi pertimbangan lain.

— Lebih Baik apache2.conf Daripada htaccess
https://bptsi.unisayogya.ac.id/lebih-baik-apache2-conf-daripada-htaccess/ 2021-08-19 16:32:01

|-Area Keamanan

  1. Aktifkan HTTPS
    a2ensite 000-default-ssl
    (https://pdsi.unisayogya.ac.id/lebih-baik-apache2-conf-daripada-htaccess/#langkah)
  2. 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)
  3. 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)
  4. 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>
  5. 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)
  6. 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)
  7. 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)
  8. Amankan upload
    (https://pdsi.unisayogya.ac.id/move-on-mpm-prefork-ke-mpm-event-sebuah-catatan/3/#amankan-upload)

|-Ide

Strategi Sub-domain
  • 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.

  1. Pastikan bahwa subdomain umum untuk http dan https diberi nama dengan awalan 000,
    • misal 000-default.conf dan 000-default-ssl.conf, karena apache2 akan membaca sites-enabled sesuai urutan abjad. Jalankan perintah
      su
      ls /etc/apache2/sites-available/000-*.conf
    • Jika belum menggunakan nama 000 di depannya, misalnya default.conf atau default-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
  2. Buat folder include
    su
    mkdir /etc/apache2/include
  3. 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>
  4. 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>
  5. 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>
  6. 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>
  7. Lakukan pengaturan sub-domain dan permalink
  8. Periksa konfigurasi setelah melakukan semua pengaturan
    apachectl configtest
  9. 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.

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:

By basit

Biro Pengembangan Teknologi Dan Sistem Informasi

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.