Apache htaccess beberapa kondisi penulisan ulang untuk beberapa aturan
Saya mengambil alih sebuah situs web dan melihat pengembang sebelumnya memiliki beberapa .htaccess
aturan penulisan ulang, ini adalah contoh singkatnya:
RewriteCond %{REQUEST_URI} !^/[0-9]+\..+\.cpaneldcv$
RewriteCond %{REQUEST_URI} !^/[A-F0-9]{32}\.txt(?:\ Comodo\ DCV)?$
RewriteCond %{REQUEST_URI} !^/\.well-known/acme-challenge/[0-9a-zA-Z_-]+$
RewriteCond %{REQUEST_URI} !^/\.well-known/pki-validation/[A-F0-9]{32}\.txt(?:\ Comodo\ DCV)?$
RewriteRule ^(.*)/landing/(.*)/(.*)$ landing.php?page=$1&id=$2&mid=$3
RewriteCond %{REQUEST_URI} !^/[0-9]+\..+\.cpaneldcv$
RewriteCond %{REQUEST_URI} !^/[A-F0-9]{32}\.txt(?:\ Comodo\ DCV)?$
RewriteCond %{REQUEST_URI} !^/\.well-known/acme-challenge/[0-9a-zA-Z_-]+$
RewriteCond %{REQUEST_URI} !^/\.well-known/pki-validation/[A-F0-9]{32}\.txt(?:\ Comodo\ DCV)?$
RewriteRule ^(.*)/landing/(.*)$ landing.php?page=$1&id=$2
RewriteCond %{REQUEST_URI} !^/[0-9]+\..+\.cpaneldcv$
RewriteCond %{REQUEST_URI} !^/[A-F0-9]{32}\.txt(?:\ Comodo\ DCV)?$
RewriteCond %{REQUEST_URI} !^/\.well-known/acme-challenge/[0-9a-zA-Z_-]+$
RewriteCond %{REQUEST_URI} !^/\.well-known/pki-validation/[A-F0-9]{32}\.txt(?:\ Comodo\ DCV)?$
RewriteRule ^(.*)/landing$ landing.php?page=$1
Ketentuan Penulisan Ulang selalu sama untuk semua aturan, apakah ada cara untuk menggabungkan Aturan Penulisan Ulang sehingga ketentuan hanya perlu ditulis sekali?
Saya telah memeriksa bendera lompat tetapi tidak ada referensi ke belakang. Sejauh yang saya lihat, saya tidak memerlukan referensi ke belakang dengan kondisi tersebut, namun, apakah melewatkan pendekatan terbaik? Atau apakah ada praktik terbaik tentang cara mencapai ini? (Seseorang menyarankan kepada saya untuk menggunakan flag QSA, namun, setelah penelitian, saya rasa itu tidak ada hubungannya dengan apa yang ingin saya capai.)
Jawaban
RewriteCond %{REQUEST_URI} !^/[0-9]+\..+\.cpaneldcv$ RewriteCond %{REQUEST_URI} !^/[A-F0-9]{32}\.txt(?:\ Comodo\ DCV)?$ RewriteCond %{REQUEST_URI} !^/\.well-known/acme-challenge/[0-9a-zA-Z_-]+$ RewriteCond %{REQUEST_URI} !^/\.well-known/pki-validation/[A-F0-9]{32}\.txt(?:\ Comodo\ DCV)?$
Blok kondisi yang berantakan ini disuntikkan secara otomatis oleh cPanel sebelum setiap RewriteRule
arahan ketika memperbaharui sertifikat keamanan SSL (Let's Encrypt?) Secara otomatis. Ketentuan ini memastikan bahwa file validasi (diperlukan untuk memperbarui sertifikat SSL) dapat diakses.
Sayangnya, saya belum bisa memahami mengapa cPanel melakukannya dengan cara ini - ini bisa menjadi mimpi buruk pemeliharaan dan saya telah menemukan arahan yang telah rusak oleh kondisi ini (memang arahannya kurang dari sempurna untuk memulai ). (Saya sudah mencoba bertanya di forum cPanel, tapi saya tidak pernah mendapatkan respon yang baik.)
... apakah ada cara untuk menggabungkan Aturan Penulisan Ulang sehingga ketentuan hanya perlu ditulis sekali?
Iya. Anda dapat memindahkan ketentuan ini ke bloknya sendiri di awal .htaccess
file dan membalikkan artinya, jadi alih-alih hanya memicu RewriteRule
saat permintaan tidak cocok dengan pola (menggunakan ekspresi reguler yang dinegasikan ). Anda dapat mencegah penulisan ulang lebih lanjut ketika permintaan memang cocok dengan pola. Sebagai contoh:
# BEGIN cPanel SSL CERT RENEWAL
RewriteCond %{REQUEST_URI} ^/[0-9]+\..+\.cpaneldcv$ [OR]
RewriteCond %{REQUEST_URI} ^/[A-F0-9]{32}\.txt(?:\ Comodo\ DCV)?$ [OR]
RewriteCond %{REQUEST_URI} ^/\.well-known/acme-challenge/[0-9a-zA-Z_-]+$ [OR]
RewriteCond %{REQUEST_URI} ^/\.well-known/pki-validation/[A-F0-9]{32}\.txt(?:\ Comodo\ DCV)?$
RewriteRule ^ - [L]
# END cPanel SSL CERT RENEWAL
Perhatikan penghapusan !
prefiks (negasi) di CondPattern dan tanda tambahan OR
pada tiga kondisi pertama. The RewriteRule
kemudian mencegah arahan mod_rewrite lanjut sedang diproses harus pertandingan permintaan.
(Pada Apache 2.4.8+, arahan ini dapat dipindahkan sepenuhnya ke konfigurasi server. Dengan bantuan RewriteOptions InheritDownBefore
.)
Kemudian, diikuti hanya dengan RewriteRule
arahan yang Anda miliki sebelumnya (meskipun saya telah menambahkan L
bendera):
RewriteRule ^(.*)/landing/(.*)/(.*)$ landing.php?page=$1&id=$2&mid=$3 [L]
RewriteRule ^(.*)/landing/(.*)$ landing.php?page=$1&id=$2 [L]
RewriteRule ^(.*)/landing$ landing.php?page=$1 [L]
Anda mungkin harus menyertakan L
tanda pada penulisan ulang yang tersisa.
Anda juga dapat menggabungkan 3 penulisan ulang tersebut menjadi satu perintah jika Anda mau, tetapi itu akan tergantung jika aplikasi Anda menangani parameter URL kosong.
(Seseorang menyarankan kepada saya untuk menggunakan flag QSA, namun, setelah penelitian, saya rasa itu tidak ada hubungannya dengan apa yang ingin saya capai.)
Ya, itu tidak ada hubungannya dengan masalah khusus ini. The QSA
(Query String Append) flag akan memungkinkan Anda untuk menggabungkan string query yang hadir pada permintaan dengan query string Anda menulis dalam RewriteRule
substitusi .