Banyak poster mengalami masalah debugging pernyataan RewriteRule dan RewriteCond mereka dalam .htaccess
file mereka . Sebagian besar menggunakan layanan hosting bersama dan karenanya tidak memiliki akses ke konfigurasi server root. Mereka tidak dapat menghindari menggunakan .htaccess
file untuk menulis ulang dan tidak dapat mengaktifkan RewriteLogLevel "seperti yang disarankan banyak responden. Juga ada banyak .htaccess
jebakan dan kendala spesifik yang tidak tercakup dengan baik. Menyiapkan uji lokal LAMP stack melibatkan terlalu banyak kurva belajar untuk sebagian besar .
Jadi Q saya di sini adalah bagaimana kami menyarankan mereka men - debug aturan mereka sendiri . Saya memberikan beberapa saran di bawah ini. Saran lain akan dihargai.
Memahami bahwa mesin mod_rewrite menggilir
.htaccess
file . Mesin menjalankan loop ini:do execute server and vhost rewrites (in the Apache Virtual Host Config) find the lowest "Per Dir" .htaccess file on the file path with rewrites enabled if found(.htaccess) execute .htaccess rewrites (in the user's directory) while rewrite occurred
Jadi aturan Anda akan dieksekusi berulang kali dan jika Anda mengubah jalur URI maka mungkin akan mengeksekusi
.htaccess
file lain jika ada. Jadi, pastikan Anda mengakhiri loop ini, jika perlu dengan menambahkan ekstraRewriteCond
untuk menghentikan aturan menembak. Hapus juga.htaccess
aturan penulisan ulang tingkat bawah kecuali secara eksplisit bermaksud menggunakan aturan multi-level.Pastikan bahwa sintaksis masing-masing Regexp benar dengan menguji terhadap serangkaian pola pengujian untuk memastikan bahwa itu adalah sintaks yang valid dan melakukan apa yang Anda inginkan dengan serangkaian URI pengujian lengkap. Lihat jawaban di bawah untuk detail lebih lanjut.
Buat aturan Anda secara bertahap di direktori tes. Anda dapat menggunakan "jalankan
.htaccess
file terdalam pada fitur path" untuk membuat direktori tes (pohon) terpisah dan men-debug aturan di sini tanpa mengacaukan aturan utama Anda dan menghentikan kerja situs Anda. Anda harus menambahkannya satu per satu karena ini adalah satu-satunya cara untuk melokalisasi kegagalan pada aturan individual.Gunakan rintisan skrip dummy untuk membuang variabel server dan lingkungan . (Lihat Listing 2 ) Jika aplikasi Anda menggunakan, katakanlah,
blog/index.php
maka Anda dapat menyalin initest/blog/index.php
dan menggunakannya untuk menguji aturan blog Anda ditest
subdirektori. Anda juga dapat menggunakan variabel lingkungan untuk memastikan bahwa mesin penulisan ulang dalam menafsirkan string substitusi dengan benar, misalnyaRewriteRule ^(.*) - [E=TEST0:%{DOCUMENT_ROOT}/blog/html_cache/$1.html]
dan cari variabel REDIRECT_ * ini di dump phpinfo. BTW, saya menggunakan yang ini dan menemukan di situs saya bahwa saya harus menggunakan
%{ENV:DOCUMENT_ROOT_REAL}
sebagai gantinya. Dalam kasus redirector looping, REDIRECT_REDIRECT_ * variabel mendaftar pass sebelumnya. Dll ..Pastikan bahwa Anda tidak digigit oleh caching browser yang salah 301 redirect . Lihat jawaban di bawah ini . Terima kasih kepada Ulrich Palha untuk ini.
Mesin penulisan ulang tampaknya sensitif terhadap aturan bertingkat dalam
.htaccess
konteks, (di situlahRewriteRule
hasil substitusi dan ini jatuh ke aturan lebih lanjut), karena saya menemukan bug dengan sub-permintaan internal (1) , dan pemrosesan PATH_INFO yang salah yang sering kali dapat dicegah dengan menggunakan bendera [NS], [L] dan [PT].
Ada komentar atau saran lagi?
Listing 1 - phpinfo
<?php phpinfo(INFO_ENVIRONMENT|INFO_VARIABLES);