วิธีการดีบัก Apache mod_rewrite


171

ฉันมีสองปัญหาหลักกับ mod_rewrite:

1) ไม่มีการรายงานข้อผิดพลาดที่มีความหมายเมื่อฉันมีกฎที่ไม่ถูกต้อง

ป้อนคำอธิบายรูปภาพที่นี่

2) ในการทดสอบการดัดแปลงแต่ละครั้งอย่างน่าเชื่อถือฉันต้องลบแคชของ Chrome นี่ไม่ใช่วิทยาศาสตร์จรวด แต่ฉันต้องกด Ctrl + Shift + Delete แล้วคลิกตกลงจากนั้นปิดหน้าต่างแล้วโหลดซ้ำ

ฉันต้องการดูว่าผู้เชี่ยวชาญที่มีความเต็มใจที่จะแบ่งปันความลับของพวกเขาเพื่อการจัดการโค้ด mod_rewrite อย่างมีประสิทธิภาพหรือไม่


1
อ๊อด, ดูstackoverflow.com/questions/9153262/ …ที่ฉันพูดถึงกลวิธี stanbdard
TerryE

คำตอบ:


283

เคล็ดลับหนึ่งคือการเปิดบันทึกการเขียนใหม่ หากต้องการเปิดใช้งานลองบรรทัดเหล่านี้ในการกำหนดค่าหลัก apache ของคุณหรือไฟล์โฮสต์เสมือนปัจจุบัน ( ไม่ใช่ใน.htaccess):

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

ตั้งแต่ Apache httpd 2.4 mod_rewrite RewriteLog และคำสั่ง RewriteLogLevel ถูกแทนที่อย่างสมบูรณ์ด้วยการกำหนดค่าการบันทึกต่อโมดูลใหม่

LogLevel alert rewrite:trace6

81
คุณไม่สามารถใส่สิ่งนี้ใน. htaccess คุณต้องวางไว้ในการกำหนดค่า VirtualHost
Attila Szeremi

7
คุณต้องมีRewriteEngine Onส่วนที่นั่นเช่นกันเพราะหากคุณเปิดใช้งานมัน (เช่นเดียวกับฉัน) ใน.htaccessไฟล์แล้วจะไม่มีการบันทึกสิ่งใด
chacham15

12
ล็อกไฟล์อยู่ที่ไหนใน apache 2.4
Charles John Thompson III

4
คุณจะพบรายการบันทึก 2.4 ในบันทึกข้อผิดพลาดที่เกี่ยวข้อง สิ่งนี้อาจขึ้นอยู่กับการกำหนดค่าของคุณ แต่การตั้งค่า Debian / Ubuntu เริ่มต้นจะมีใน /var/log/apache2/error.log
Josiah

10
เคล็ดลับสำหรับมืออาชีพ: อย่าลืมปิดการบันทึกการเขียนซ้ำ ถ้าคุณลืมคุณจะเติมฮาร์ดดิสก์ของคุณอย่างรวดเร็วโดยเฉพาะบนเซิร์ฟเวอร์ที่ใช้งานจริง
John Hunt

132

LogRewrite directive ดังที่ Ben ได้กล่าวไว้ไม่สามารถใช้งานได้อีกต่อไปใน Apache 2.4 คุณต้องใช้คำสั่ง LogLevel แทน เช่น

LogLevel alert rewrite:trace6

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


22
ไฟล์บันทึกเชื่อมโยงกับไฟล์นี้อยู่ที่ไหน
Charles John Thompson III

8
@CharlesJohnThompsonIII - logfile เป็นบันทึกข้อผิดพลาด (ระบุโดยคำสั่ง ErrorLog) ต่อเอกสารคุณจะได้รับเพียงข้อความที่เขียนใหม่ด้วย grep:tail -f error_log|fgrep '[rewrite:'
billynoah

1
อย่าลืมรีสตาร์ apache
นักบัญชี

1
ฉันต้องทำให้แน่ใจว่าAllowOverrideได้ตั้งค่าไว้All!
ไมเคิล

25

สำหรับการแก้ปัญหา URL พื้นฐานให้ใช้ตัวเรียกบรรทัดคำสั่งเช่นwgetหรือcurlทำการทดสอบแทนที่จะใช้เบราว์เซอร์แบบกำหนดเอง จากนั้นคุณไม่ต้องล้างแคชใด ๆ เพียงแค่ลูกศรขึ้นและเข้าสู่เชลล์เพื่อเรียกใช้การทดสอบอีกครั้ง


14
เคล็ดลับอีกอย่างคือการใช้ Chrome "โหมดพร" (Ctl + Shift + N) เมื่อคุณปิดหน้าต่างบริบทเซสชันใด ๆ ที่แคชจะถูกทิ้งในถังขยะ
TerryE

ฉันคิดว่า Firefox "เซสชันส่วนตัว" กำลังเรียกดูด้วย แต่คุณกำลังบอกว่าบริบทนี้เป็นแบบหน้าต่างแต่ละบาน (ดังนั้นคุณไม่ได้ปิด Chrome?)
Kaz

2
AFAIK, Chrome และ Ff นั้นแตกต่างจาก Ff ที่ทำงานเป็นกระบวนการเดียวซึ่งอยู่ในโหมดส่วนตัวหรือไม่ ด้วย Chrome แต่ละแท็บหรือหน้าต่างจะทำงานเป็นกระบวนการแยกต่างหากและสามารถแยกกันในโหมดส่วนตัว ปิดหน้าต่าง / แท็บส่วนตัวและบริบทจะถูกทิ้งในถังขยะ
TerryE

1
PrivateTab addon สำหรับ FF ทำสิ่งนั้น แต่ละแท็บทำงานเป็นรายบุคคล
Javid

วิธีนี้ยังแสดงการเปลี่ยนเส้นทาง! เหมาะสำหรับคนที่ไม่มีสิทธิ์เข้าถึงไฟล์ apache config ของเครื่อง
Geof Sawaya

14

มีผู้ทดสอบ htaccessอยู่

มันแสดงให้เห็นว่าเงื่อนไขใดได้รับการทดสอบสำหรับ URL ที่แน่นอนซึ่งเป็นไปตามเกณฑ์และกฎใดที่ถูกดำเนินการ

ดูเหมือนว่าจะมีข้อบกพร่องบางอย่าง


2
สำหรับฉันมันแสดงให้เห็นว่ากฎการดำเนินการสีเขียวในบรรทัดสุดท้ายโดยไม่มีรหัสใด ๆ
Andy

@thombr คุณจะแม่นยำกว่านี้ได้ไหม ลิงค์ไม่ทำงาน? หรือเครื่องมือ? อะไรที่ใช้ไม่ได้ และทำไมจึงมีความเกี่ยวข้องในบริบทของคำถามนี้
Andy

1
สิ่งนี้บอกฉันว่า URL กำลังถูกแปลงอย่างที่คาดไว้ ... อย่างไรก็ตามบนเซิร์ฟเวอร์จริงฉันได้รับ 404
Michael

@michael กฎทดสอบมีเพียงหนึ่งเดียวที่มีอยู่ในการกำหนดค่าของคุณหรือไม่ mod_rewrite ได้รับการติดตั้งและใช้งานจริงหรือไม่?
Andy

ปรากฎว่าไม่สามารถเปิดใช้งานการแทนที่ได้
Michael

3

จากคำตอบของ Benคุณสามารถทำสิ่งต่อไปนี้เมื่อรัน apache บน Linux (Debian ในกรณีของฉัน)

ขั้นแรกให้สร้างไฟล์ rewrite-log.load

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

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

จากนั้นใส่

$ a2enmod เขียนบันทึกใหม่

ติดตามโดย

$ service apache2 รีสตาร์ท

และเมื่อคุณเสร็จสิ้นการดีบักกฎการเขียนใหม่ของคุณแล้ว

$ a2dismod เขียนบันทึกใหม่ && บริการ apache2 รีสตาร์ท


สิ่งนี้ไม่ได้ผล ฉันได้รับ sandino @ envy: ~ $ sudo บริการรีสตาร์ท apache2 * การรีสตาร์ทเว็บเซิร์ฟเวอร์ apache2 [ล้มเหลว] * apache2 configtest ล้มเหลว เอาต์พุตของการทดสอบการกำหนดค่าคือ: AH00526: ข้อผิดพลาดทางไวยากรณ์ในบรรทัดที่ 1 ของ /etc/apache2/mods-enabled/rewrite-log.load: คำสั่งที่ไม่ถูกต้อง 'RewriteLog' อาจจะสะกดผิดหรือกำหนดโดยโมดูลที่ไม่รวมอยู่ในการกำหนดค่าเซิร์ฟเวอร์
sandino

3
@sandino คุณใช้ apache รุ่นใด? ดูเหมือนว่ารูปแบบนี้จะถูกเปลี่ยนเป็น 2.4 ใช้แทน: LogLevel warn rewrite:trace8หรือLogLevel info rewrite:trace8ที่ 8 สามารถเป็นตัวเลขใด ๆ จาก 1-8
บ้า
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.