Apache htaccess beberapa kondisi penulisan ulang untuk beberapa aturan

Nov 23 2017

Saya mengambil alih sebuah situs web dan melihat pengembang sebelumnya memiliki beberapa .htaccessaturan 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

3 MrWhite Nov 23 2017 at 23:23
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 RewriteRulearahan 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 .htaccessfile dan membalikkan artinya, jadi alih-alih hanya memicu RewriteRulesaat 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 ORpada tiga kondisi pertama. The RewriteRulekemudian 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 RewriteRulearahan yang Anda miliki sebelumnya (meskipun saya telah menambahkan Lbendera):

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 Ltanda 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 .