Cara men-debug .htaccess RewriteRule tidak berfungsi

115

Saya memiliki RewriteRuledalam .htaccessfile yang tidak melakukan apa-apa. Bagaimana cara memecahkan masalah ini?

  • Bagaimana saya bisa memverifikasi apakah .htaccessfile tersebut bahkan sedang dibaca dan dipatuhi oleh Apache? Dapatkah saya menulis pesan echo "itu berfungsi", jika saya menulisnya, di mana baris itu akan digema?
  • Jika .htaccessfile tidak digunakan, bagaimana saya bisa membuat Apache menggunakannya?
  • Jika .htaccesssedang digunakan tetapi saya RewriteRulemasih tidak berpengaruh, apa lagi yang dapat saya lakukan untuk men-debug?
macha
sumber

Jawaban:

144

Masukkan beberapa nilai sampah ke dalam .htaccess mis. foo bar, sakjnaskljdnas Kata kunci apa pun yang tidak dikenali oleh htaccess dan kunjungi URL Anda. Jika berhasil, Anda harus mendapatkan file

500 Internal Server Error

Kesalahan server dari dalam

Server mengalami kesalahan internal atau kesalahan konfigurasi dan tidak dapat menyelesaikan permintaan Anda ....

Saya menyarankan Anda untuk segera menaruhnya setelah itu RewriteEngine on.


Karena Anda berada di mesin Anda. Saya kira Anda memiliki akses ke .conffile apache .

buka .conffile tersebut, dan cari baris yang mirip dengan:

LoadModule rewrite_module modules/mod_rewrite.so

Jika diberi komentar (#), hapus komentar dan restart apache.


Untuk log menulis ulang

RewriteEngine On
RewriteLog "/path/to/rewrite.log"
RewriteLogLevel 9

Letakkan 3 baris di atas di file virtualhost. mulai ulang httpd.

RewriteLogLevel 9Menggunakan nilai tinggi untuk Level akan memperlambat server Apache Anda secara dramatis! Gunakan file log penulisan ulang pada Level yang lebih besar dari 2 hanya untuk debugging! Level 9 akan mencatat hampir setiap detail rewritelog.


MEMPERBARUI

Hal-hal telah berubah di Apache 2.4:

DARI Meningkatkan ke 2.4 dari 2.2

Perintah RewriteLog dan RewriteLogLevel telah dihapus. Fungsionalitas ini sekarang disediakan dengan mengkonfigurasi tingkat pencatatan yang sesuai untuk modul mod_rewrite menggunakan direktif LogLevel . Lihat juga bagian logging mod_rewrite.

Untuk informasi lebih lanjut tentang LogLevel, lihat Petunjuk LogLevel

Anda bisa mencapai

RewriteLog "/path/to/rewrite.log"

dengan cara ini sekarang

LogLevel debug rewrite_module:debug
ThinkingMonkey
sumber
Ok, jadi masalahnya adalah, saya mencoba menambahkan rewriterule ke file .htaccess, dan karena alasan tertentu file itu tidak menggunakannya.
macha
@macha coba metode di atas. Jika Anda mendapatkan kesalahan server internal, itu berarti mod_rewrite (.htaccess) diaktifkan. Apakah Anda di host bersama?
ThinkingMonkey
Tidak, saya sedang mengerjakan localhost saya, apakah Anda tahu kapan file .htaccess dimuat? Saya pikir Apache akan membaca ini dulu
macha
File @macha .htcess tidak pernah dimuat. Mereka diakses (jika ada) oleh apache ketika Anda mencoba mengakses halaman yang ada di folder itu.
ThinkingMonkey
ok pertanyaan saya adalah, jika seseorang meminta halaman web, apakah apache langsung kebagian skrip sisi server atau akan mencari file .htaccess di folder itu dan kemudian melanjutkan ??
macha
52

Jawaban 'Masukkan nilai sampah' tidak berhasil bagi saya, situs saya terus memuat meskipun sampah telah dimasukkan.

Sebagai gantinya saya menambahkan baris berikut ke bagian atas file .htaccess:

deny from all

Ini akan segera memberi tahu Anda jika .htaccess diambil atau tidak. Jika .htaccess sedang digunakan, file di folder itu tidak akan dimuat sama sekali.

caitriona
sumber
4
Ini adalah tes paling sederhana jika Anda tidak keberatan tidak ada yang berfungsi selama beberapa detik saat Anda memverifikasi.
Mordred
1
Ya - butuh waktu sekitar satu detik untuk memverifikasi bahwa situs yang saya kerjakan tidak menggunakan file .htaccess.
bonh
1
Terima kasih, berfungsi seperti pesona :) menghemat waktu debugging!
Martijn van Hoof
32

Umumnya setiap perubahan dalam .htaccess harus memiliki efek yang terlihat. Jika tidak berpengaruh, periksa file apache konfigurasi Anda, seperti:

<Directory ..>
    ...
    AllowOverride None
    ...
</Directory>

Harus diubah menjadi

AllowOverride All

Dan Anda akan dapat mengubah arahan di file .htaccess.

jgpATs2w
sumber
Terima kasih. Saya menemukan bagian yang relevan di file apache2.conf utama untuk pohon direktori / var / www
Tim Richardson
6

Mungkin metode yang lebih logis adalah membuat file (mis. Test.html), menambahkan beberapa konten dan kemudian mencoba mengaturnya sebagai halaman indeks:

DirectoryIndex test.html

Untuk sebagian besar, aturan .htaccess akan menggantikan konfigurasi Apache yang bekerja pada level direktori / file

Cez
sumber
4

Untuk menjawab pertanyaan pertama dari tiga pertanyaan yang diajukan, cara sederhana untuk melihat apakah file .htaccess berfungsi atau tidak adalah dengan memicu kesalahan khusus di bagian atas file .htaccess:

ErrorDocument 200 "Hello. This is your .htaccess file talking."
RewriteRule ^ - [L,R=200]

Untuk pertanyaan kedua Anda, jika file .htaccess tidak sedang dibaca, kemungkinan konfigurasi Apache utama server telah AllowOverridedisetel ke None. Dokumentasi Apache memiliki tip pemecahan masalah untuk itu dan kasus lain yang mungkin mencegah akses .htaccess.

Terakhir, untuk menjawab pertanyaan ketiga Anda, jika Anda perlu men-debug variabel tertentu yang Anda referensikan dalam aturan penulisan ulang Anda atau menggunakan ekspresi yang ingin Anda evaluasi secara independen dari aturan, Anda dapat melakukan hal berikut:

Keluarkan variabel yang Anda rujuk untuk memastikannya memiliki nilai yang Anda harapkan:

ErrorDocument 200 "Request: %{THE_REQUEST} Referrer: %{HTTP_REFERER} Host: %{HTTP_HOST}"
RewriteRule ^ - [L,R=200]

Uji ekspresi secara independen dengan memasukkannya ke dalam <If>Directive. Ini memungkinkan Anda untuk memastikan ekspresi Anda ditulis dengan benar atau cocok ketika Anda mengharapkannya:

<If "%{REQUEST_URI} =~ /word$/">
    ErrorDocument 200 "Your expression is priceless!"
    RewriteRule ^ - [L,R=200]
</If>

Selamat men-debug .htaccess!

PeterA
sumber
3

Jika Anda memiliki akses ke direktori apache bin yang dapat Anda gunakan,

httpd -M untuk memeriksa modul yang dimuat terlebih dahulu.

 info_module (shared)
 isapi_module (shared)
 log_config_module (shared)
 cache_disk_module (shared)
 mime_module (shared)
 negotiation_module (shared)
 proxy_module (shared)
 proxy_ajp_module (shared)
 rewrite_module (shared)
 setenvif_module (shared)
 socache_shmcb_module (shared)
 ssl_module (shared)
 status_module (shared)
 version_module (shared)
 php5_module (shared)

Setelah itu, arahan sederhana seperti Options -Indexesatau deny from allakan memperkuat bahwa .htaccess berfungsi dengan benar.

Abhishek Gurjar
sumber
1

Untuk menguji aturan penulisan ulang htaccess Anda, cukup isi url yang Anda terapkan aturannya, tempatkan konten htaccess Anda pada area input yang lebih besar dan tekan tombol "Test".

http://htaccess.mwl.be/

Ganesh Kandu
sumber
-1

Mengapa tidak menaruh beberapa sampah di file .htaccess Anda dan mencoba memuat ulang apache. Jika apache gagal untuk memulai Anda tahu itu berfungsi. Hapus junk lalu muat ulang apache jika memuat selamat, Anda telah mengkonfigurasi .htaccess dengan benar.

Ben Rabidou
sumber
7
Saya tidak berpikir Apache akan gagal untuk memulai atau menjalankan jika ada .htaccess yang buruk, mengingat bahwa ia tidak memeriksa .htaccess sampai ada permintaan halaman.
Andrew