Bagaimana cara debug Apache mod_rewrite

171

Saya memiliki dua masalah utama dengan mod_rewrite:

1) Tidak ada kesalahan berarti yang dilaporkan ketika saya memiliki aturan yang tidak valid

masukkan deskripsi gambar di sini

2) Untuk menguji setiap modifikasi dengan andal, saya harus menghapus cache chrome. Ini bukan ilmu roket, tapi saya harus menekan Ctrl + Shift + Delete lalu klik OK, lalu tutup jendela, dan muat ulang.

Saya ingin melihat apakah ada guru yang mau membagikan rahasia mereka untuk mengelola kode mod_rewrite secara efisien.

puk
sumber
1
Puk, lihat stackoverflow.com/questions/9153262/... di mana saya membahas beberapa trik standar.
TerryE
kemungkinan duplikat dari Cara men-debug script penulisan ulang htaccess
pengguna

Jawaban:

283

Salah satu triknya adalah menyalakan log penulisan ulang. Untuk menyalakannya, coba baris ini di konfigurasi utama apache Anda atau file host virtual saat ini ( tidak di .htaccess):

RewriteEngine On
RewriteLog "/var/log/apache2/rewrite.log"
RewriteLogLevel 3

Sejak Apache httpd 2.4 mod_rewrite, RewriteLog dan arahan RewriteLogLevel telah sepenuhnya digantikan oleh konfigurasi logging per-modul yang baru.

LogLevel alert rewrite:trace6
Ben
sumber
81
Anda tidak dapat memasukkan ini ke dalam .htaccess. Anda harus meletakkannya di konfigurasi VirtualHost.
Attila Szeremi
7
Anda harus memiliki RewriteEngine Onbagian di sana juga karena jika Anda hanya mengaktifkannya (seperti yang saya lakukan) dalam .htaccessfile, maka tidak ada yang akan dicatat.
chacham15
12
di mana file log terletak di apache 2.4?
Charles John Thompson III
4
Anda akan menemukan 2,4 item log di log kesalahan yang relevan. Ini mungkin tergantung pada konfigurasi Anda, tetapi pengaturan Debian / Ubuntu default memilikinya di /var/log/apache2/error.log
Josiah
10
Kiat pro: Ingatlah untuk mematikan penulisan ulang penulisan ulang Anda. Jika Anda lupa, Anda akan segera mengisi hard disk dengan cepat, terutama pada server produksi.
John Hunt
132

Arahan LogRewrite seperti yang disebutkan oleh Ben tidak tersedia lagi di Apache 2.4. Anda harus menggunakan arahan LogLevel sebagai gantinya. Misalnya

LogLevel alert rewrite:trace6

Lihat http://httpd.apache.org/docs/2.4/mod/mod_rewrite.html#logging

Tobias Schultze
sumber
22
di mana file log dikaitkan dengan ini?
Charles John Thompson III
8
@CharlesJohnThompsonIII - Logfile adalah log kesalahan (ditentukan oleh direktif ErrorLog). Per dokumen, Anda bisa mendapatkan pesan penulisan ulang hanya dengan grep:tail -f error_log|fgrep '[rewrite:'
billynoah
1
jangan lupa untuk me-restart apache
Akuntan
1
Saya harus memastikan AllowOverridediatur ke All!
Michael
25

Untuk resolusi URL dasar, gunakan pengambil baris perintah suka wgetatau curluntuk melakukan pengujian, daripada browser manual. Maka Anda tidak perlu menghapus cache apa pun; hanya panah atas dan Masukkan di shell untuk menjalankan kembali tes mengambil Anda.

Kaz
sumber
14
Trik lain adalah menggunakan Chrome "mode Porno" (Ctl + Shift + N). Saat Anda menutup jendela, setiap konteks sesi yang di-cache dibuang.
TerryE
Saya pikir penjelajahan "sesi pribadi" Firefox juga. Tetapi apakah Anda mengatakan ini konteks ini adalah per jendela individu (jadi Anda tidak menutup Chrome?)
Kaz
2
AFAIK, Chrome dan Ff berbeda karena Ff berjalan sebagai satu proses yang dalam mode privat atau tidak. Dengan Chrome, setiap tab atau jendela berjalan sebagai proses terpisah dan dapat secara individual dalam mode pribadi; tutup jendela / tab pribadi dan konteksnya dibuang.
TerryE
1
Addon PrivateTab untuk FF melakukan hal itu. Setiap tab bekerja secara terpisah.
Javid
Metode ini juga menunjukkan arahan ulang! Bagus untuk seseorang yang tidak memiliki akses ke file konfigurasi mesin apache.
Geof Sawaya
14

Ada tester htaccess .

Ini menunjukkan kondisi mana yang diuji untuk URL tertentu, mana yang memenuhi kriteria dan aturan mana yang dijalankan.

Sepertinya ada beberapa gangguan.

Andy
sumber
2
Bagi saya itu menunjukkan aturan yang dieksekusi hijau di baris terakhir tanpa kode.
Andy
@ thombr, bisakah kamu lebih tepat? Tautan tidak berfungsi? Atau alatnya? Apa yang sebenarnya tidak berhasil? Dan mengapa itu relevan dalam konteks pertanyaan ini?
Andy
1
Ini memberitahu saya bahwa URL sedang diubah seperti yang diharapkan ... namun pada server yang sebenarnya saya mendapatkan 404
Michael
@ Michael adalah aturan yang diuji yang hanya ada di konfigurasi Anda? Apakah mod_rewrite benar-benar diinstal dan aktif?
Andy
Ternyata penggantian tidak diaktifkan
Michael
3

Berdasarkan jawaban Ben Anda dapat melakukan hal berikut saat menjalankan apache di Linux (Debian dalam kasus saya).

Pertama buat file rewrite-log.load

/etc/apache2/mods-availabe/rewrite-log.load

RewriteLog "/var/log/apache2/rewrite.log"
RewriteLogLevel 3

Lalu masuk

$ a2enmod menulis ulang-log

diikuti oleh

$ service apache2 restart

Dan ketika Anda selesai dengan men-debug aturan penulisan ulang Anda

$ a2dismod rewrite-log && service apache2 restart

Mengalir
sumber
Ini tidak berhasil. Saya mendapatkan sandino @ iri: ~ $ sudo service apache2 restart * Restart server web apache2 [gagal] * Configtest apache2 gagal. Output dari tes konfigurasi adalah: AH00526: Kesalahan sintaks pada baris 1 dari /etc/apache2/mods-enabled/rewrite-log.load: Perintah 'RewriteLog' yang tidak valid, mungkin salah eja atau ditentukan oleh modul yang tidak termasuk dalam konfigurasi server
sandino
3
@ sandino, versi apache apa yang Anda jalankan? Tampaknya sintaks ini diubah untuk 2.4, gunakan sebagai gantinya: LogLevel warn rewrite:trace8atau di LogLevel info rewrite:trace8mana 8 dapat berupa angka dari 1-8
insaner