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);
sumber
Jawaban:
Berikut adalah beberapa tips tambahan tentang aturan pengujian yang dapat memudahkan debugging untuk pengguna di hosting bersama
1. Gunakan agen pengguna palsu
Saat menguji aturan baru, tambahkan syarat untuk hanya menjalankannya dengan
fake
agen-pengguna yang akan Anda gunakan untuk permintaan Anda. Dengan cara ini tidak akan memengaruhi orang lain di situs Anda.misalnya
Jika Anda menggunakan Firefox, Anda dapat menggunakan User Agent Switcher untuk membuat string dan pengujian agen pengguna palsu.
2. Jangan gunakan 301 sampai Anda selesai menguji
Saya telah melihat begitu banyak posting di mana orang masih menguji aturan mereka dan mereka menggunakan 301. JANGAN .
Jika Anda tidak menggunakan saran 1 di situs Anda, tidak hanya Anda, tetapi siapa pun yang mengunjungi situs Anda pada saat itu akan terpengaruh oleh 301.
Ingatlah bahwa mereka permanen, dan di-cache secara agresif oleh browser Anda. Gunakan 302 bukan sampai Anda yakin, lalu ubah ke 301.
3. Ingat bahwa 301's secara agresif di-cache di browser Anda
Jika aturan Anda tidak berfungsi dan tampaknya tepat untuk Anda, dan Anda tidak menggunakan saran 1 dan 2, maka tes ulang setelah membersihkan cache browser Anda atau saat browsing pribadi.
4. Gunakan alat Pengambilan HTTP
Gunakan alat penangkapan HTTP seperti Fiddler untuk melihat lalu lintas HTTP aktual antara browser Anda dan server.
Sementara orang lain mungkin mengatakan itu milik Anda
site does not look right
, Anda bisa melihat dan melaporkannyaall of the images, css and js are returning 404 errors
, dengan cepat mempersempit masalahnya.Sementara orang lain akan melaporkan bahwa Anda
started at URL A and ended at URL C
, Anda dapat melihat bahwa mereka mulaiURL A, were 302 redirected to URL B and 301 redirected to URL C
. Bahkan jika URL C adalah tujuan akhir, Anda akan tahu bahwa ini buruk untuk SEO dan perlu diperbaiki.Anda akan dapat melihat header cache yang ditetapkan di sisi server, memutar ulang permintaan, memodifikasi header permintaan untuk menguji ....
sumber
[L,R=302]
[L, R=302]
apakah[L,R]
defaultnya302
Pengujian penulisan ulang .htaccess online
Saya menemukan ini Googling untuk regex bantuan, itu menyelamatkan saya banyak waktu dari keharusan untuk meng-upload baru
.htaccess
file setiap kali saya melakukan sedikit modifikasi.dari situs:
sumber
Jangan lupa bahwa dalam file .htaccess itu adalah URL relatif yang cocok.
Dalam file .htaccess, RewriteRule berikut tidak akan pernah cocok:
sumber
/
, tetapi pengupasan ini tidak terjadi untuk string yang cocok yang dirangkai dalam perintah Rewrite Cond .Pastikan bahwa sintaks dari setiap Regexp sudah 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 regexpCheck.php di bawah ini untuk skrip sederhana yang dapat Anda tambahkan ke direktori pribadi / tes di situs Anda untuk membantu Anda melakukan ini. Saya menyimpan ini singkat daripada cantik. Cukup lewati ini ke file
regexpCheck.php
di direktori tes untuk menggunakannya di situs web Anda. Ini akan membantu Anda membangun regexp dan mengujinya terhadap daftar kasus uji saat Anda melakukannya. Saya menggunakan mesin PHP PCRE di sini, tetapi setelah melihat sumber Apache, ini pada dasarnya identik dengan yang digunakan di Apache. Ada banyak HowTos dan tutorial yang menyediakan template dan dapat membantu Anda membangun keterampilan regexp Anda.Listing 1 - regexpCheck.php
sumber
import_request_variables
sudah tidak digunakan lagi di PHP 5.3 dan dihapus di 5.4.extract($_GET)
ditambah denganextract($_POST)
dapat melakukan fungsi yang sama, tetapi semua variabel akan memerlukan awalan dihapus dari namanya. Sumber: php.net/manual/en/function.import-request-variables.phpPastikan Anda menggunakan tanda persen di depan variabel, bukan tanda dolar.
Ini
%{HTTP_HOST}
, tidak${HTTP_HOST}
. Tidak akan ada apa-apa di error_log, tidak akan ada Kesalahan Server Internal, regexp Anda masih benar, aturannya tidak akan cocok. Ini benar-benar mengerikan jika Anda sering bekerja dengan django / genshi templates dan miliki${}
untuk substitusi variabel dalam memori otot.sumber
Satu dari beberapa jam yang saya buang:
Jika Anda telah menerapkan semua tips ini dan hanya terjadi 500 kesalahan karena Anda tidak memiliki akses ke log kesalahan server, mungkin masalahnya bukan di .htaccess tetapi dalam file yang dialihkan ke.
Setelah saya memperbaiki masalah .htaccess saya, saya menghabiskan dua jam lagi mencoba memperbaikinya lagi, meskipun saya hanya lupa tentang beberapa izin.
sumber
.htaccess
masalah yang sulit .Setel variabel lingkungan dan gunakan tajuk untuk menerimanya:
Anda dapat membuat variabel lingkungan baru dengan baris RewriteRule, seperti yang disebutkan oleh OP:
Tetapi jika Anda tidak bisa membuat skrip sisi server berfungsi, bagaimana Anda bisa membaca variabel lingkungan ini? Salah satu solusinya adalah mengatur tajuk:
Nilai menerima penentu format , termasuk
%{NAME}e
penentu untuk variabel lingkungan (jangan lupa huruf kecil e). Kadang-kadang, Anda perlu menambahkanREDIRECT_
awalan, tetapi saya belum berhasil ketika awalan itu ditambahkan dan ketika tidak.sumber
REDIRECT_
awalan? Juga, saya melihat terminologi tentang awalan dalam konteks (htaccess) lain juga, tetapi tidak pernah jelas apa yang dimaksud. Apakah itu berarti bahwa Anda harus memberi nama variabel Anda dengan awalan, atau menambahkan awalan ke variabel bernama Anda, ketika menggunakan perintah tertentu (tetapi tidak perintah lain)? Misalnya Anda adalah pertama yang menunjukkan kedua definisi var, dan penggunaan var, jadi dari ini saya cenderung berpikir yang terakhir! Dokumennya sedikit membantu - mereka menganggap kita tahu terlalu banyak, dan memberikan terlalu sedikit referensi / tautan.Jika Anda membuat pengalihan, uji dengan curl untuk menghindari masalah caching browser. Gunakan -I untuk mengambil header http saja. Gunakan -L untuk mengikuti semua pengalihan.
sumber
Saya menemukan pertanyaan ini ketika mencoba men-debug masalah mod_rewrite saya, dan itu pasti memiliki beberapa saran yang bermanfaat. Tetapi pada akhirnya yang paling penting adalah memastikan Anda memiliki sintaks regex Anda yang benar. Karena masalah dengan sintaks RE saya sendiri, menginstal skrip regexpCheck.php bukan pilihan yang layak.
Tetapi karena Apache menggunakan Perl-Compatible Regular Expressions (PCRE), alat apa pun yang membantu penulisan PCRE akan membantu. Saya telah menggunakan alat RegexPlanet dengan Java dan Javascript REs di masa lalu, dan senang menemukan bahwa mereka mendukung Perl juga.
Cukup ketik ekspresi reguler Anda dan satu atau lebih URL contoh, dan itu akan memberi tahu Anda jika regex cocok (a "1" di kolom "~ =") dan jika ada, setiap grup yang cocok (angka dalam "split" kolom akan sesuai dengan angka yang diharapkan Apache, mis. $ 1, $ 2 dll.) untuk setiap URL. Mereka mengklaim dukungan PCRE "dalam versi beta", tetapi hanya itu yang saya butuhkan untuk menyelesaikan masalah sintaksis saya.
http://www.regexplanet.com/advanced/perl/index.html
Saya hanya akan menambahkan komentar ke jawaban yang ada tetapi reputasi saya belum pada tingkat itu. Semoga ini bisa membantu seseorang.
sumber
Mengenai 4., Anda masih perlu memastikan bahwa "rintisan naskah boneka" Anda sebenarnya adalah URL target setelah semua penulisan ulang dilakukan, atau Anda tidak akan melihat apa pun!
Trik serupa / terkait (lihat pertanyaan ini ) adalah memasukkan aturan sementara seperti:
Di mana
show.php
ada beberapa skrip yang sangat sederhana yang hanya menampilkan$_GET
parameternya (Anda dapat menampilkan variabel lingkungan juga, jika Anda mau).Ini akan menghentikan penulisan ulang pada saat Anda memasukkannya ke dalam ruleset, lebih seperti breakpoint di debugger.
Jika Anda menggunakan Apache <2.3.9, Anda harus menggunakan
[L]
daripada[END]
, dan Anda mungkin perlu menambahkan:Di bagian paling atas dari aturan Anda, jika URL
/show.php
itu sendiri sedang ditulis ulang.sumber
Beberapa kesalahan yang saya amati terjadi ketika menulis
.htaccess
Penggunaan
^(.*)$
berulang dalam beberapa aturan, menggunakan^(.*)$
menyebabkan aturan lain menjadi impoten dalam kebanyakan kasus, karena cocok dengan semua url dalam satu hit.Jadi, jika kita menggunakan aturan untuk url ini,
sapmle/url
ia juga akan mengkonsumsi url inisapmle/url/string
.[L]
bendera harus digunakan untuk memastikan aturan kami telah melakukan pemrosesan.Harus tahu tentang:
Perbedaan dalam% n dan $ n
%n
dicocokkan selama%{RewriteCond}
bagian dan dicocokkan$n
pada%{RewriteRule}
bagian.Bekerja dari RewriteBase
sumber
Jika Anda berencana untuk menulis lebih dari satu baris aturan dalam
.
Saya sudah membuang-buang waktu menetapkan banyak aturan, tanpa umpan balik dari LOG, hanya untuk akhirnya menyerah.
Saya mendapatkan Apache di PC saya, menyalin seluruh situs ke HDD-nya, dan mengatur seluruh aturan, menggunakan log, sangat cepat.
Kemudian saya meninjau aturan lama saya, yang berfungsi. Saya melihat mereka tidak benar-benar melakukan apa yang diinginkan. Bom waktu, diberi alamat yang sedikit berbeda.
Ada begitu banyak lubang jatuh dalam aturan penulisan ulang, itu bukan hal yang logis sama sekali.
Anda dapat mengaktifkan dan menjalankan Apache dalam sepuluh menit, ini 10MB, lisensi yang bagus, * NIX / WIN / MAC siap, bahkan tanpa menginstal.
Juga, periksa baris tajuk server Anda dan dapatkan versi Apache yang sama dari arsip mereka jika sudah lama. OP saya masih di 2.0; banyak hal yang tidak didukung.
sumber
mod_rewrite
aturan debugging , tetapi pembukaan "bahkan tidak memikirkannya" hanyalah saran yang buruk untuk pengguna layanan dasar bersama yang berjuang untuk memahami mengapahtaccess
file mereka tidak ada . t bekerja dengan cara yang mereka inginkan..htaccess
file Anda " maka ini lebih seimbang. Ya, cukup mudah untuk mengatur layanan Apache lokal, tetapi membuatnya mencerminkan layanan hosting bersama penyedia layanan bisa rumit, dan di luar tingkat keterampilan banyak pengguna yang mungkin baru saja menggunakan pengaturan satu-klik Wordpress, katakan, dan memiliki masalah dengan.htaccess
file mereka .Saya akan meninggalkan ini di sini, mungkin detail yang jelas, tetapi membuat saya membenturkan kepalaku selama berjam-jam: hati-hati menggunakan
%{REQUEST_URI}
karena apa yang dikatakan @Krist van Besien dalam jawabannya benar-benar benar, tetapi tidak untuk string REQUEST_URI , karena kehabisan ini TestString dimulai dengan a/
. Jadi berhati-hatilah:sumber
(Mirip dengan ide Doin) Untuk menunjukkan apa yang cocok, saya menggunakan kode ini
Simpan ke r.php di root server dan kemudian lakukan beberapa tes di .htaccess
Misalnya, saya ingin mencocokkan url yang tidak dimulai dengan awalan bahasa
sumber
QUERY_STRING
seperti yang ditunjukkan oleh @JCastell, tester online melakukan pekerjaan yang baik untuk menguji pengalihan individu terhadap file .htaccess. Namun, yang lebih menarik adalah api yang terpapar yang dapat digunakan untuk menguji batch daftar url menggunakan objek json. Namun, untuk membuatnya lebih berguna, saya telah menulis file skrip bash kecil yang menggunakan curl dan jq untuk mengirimkan daftar url dan mem-parsing respon json ke dalam output form CSV dengan nomor baris dan aturan yang cocok dengan file htaccess bersama dengan url yang dialihkan, sehingga cukup mudah untuk membandingkan daftar url dalam spreadsheet dan dengan cepat menentukan aturan mana yang tidak berfungsi.
sumber
Jika Anda bekerja dengan url, Anda mungkin ingin memeriksa apakah "Enable Mod Rewrite"
sumber