วิธีการดีบัก. htaccess RewriteRule ไม่ทำงาน


115

ฉันมีRewriteRuleใน.htaccessแฟ้มที่ไม่ได้ทำอะไร ฉันจะแก้ไขปัญหานี้ได้อย่างไร

  • ฉันจะตรวจสอบได้อย่างไรว่า.htaccessApache กำลังอ่านและปฏิบัติตามไฟล์อยู่หรือไม่ ฉันสามารถเขียนข้อความสะท้อน "มันใช้งานได้" ได้ไหมถ้าฉันเขียนมันบรรทัดนั้นจะสะท้อนออกมาที่ไหน
  • หาก.htaccessไม่ได้ใช้ไฟล์จะทำให้ Apache ใช้งานได้อย่างไร?
  • หาก.htaccessกำลังใช้งานอยู่ แต่ของฉันRewriteRuleยังไม่มีเอฟเฟกต์ฉันจะแก้ไขข้อบกพร่องได้อย่างไร

คำตอบ:


144

ป้อนค่าขยะบางอย่างเป็นของคุณ.htaccess เช่นfoo bar, sakjnaskljdnas คำหลักใด ๆ ไม่ได้รับการยอมรับโดย htaccess และเยี่ยมชม URL ของคุณ หากใช้งานได้คุณควรได้รับไฟล์

500 ข้อผิดพลาดภายในเซิร์ฟเวอร์

ข้อผิดพลาดภายในเซิร์ฟเวอร์

เซิร์ฟเวอร์พบข้อผิดพลาดภายในหรือการกำหนดค่าผิดพลาดและไม่สามารถดำเนินการตามคำขอของคุณได้ ....

RewriteEngine onผมแนะนำให้คุณที่จะนำมันไม่นานหลังจากนั้น


เนื่องจากคุณอยู่บนเครื่องของคุณ ฉันคิดว่าคุณสามารถเข้าถึง.confไฟล์apache ได้

เปิด.confไฟล์และมองหาบรรทัดที่คล้ายกับ:

LoadModule rewrite_module modules/mod_rewrite.so

หากมีการแสดงความคิดเห็น (#) ให้ยกเลิกการแสดงความคิดเห็นและรีสตาร์ท apache


เพื่อบันทึกการเขียนซ้ำ

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

ใส่ 3 บรรทัดข้างบนในvirtualhostไฟล์. รีสตาร์ท httpd.

RewriteLogLevel 9การใช้ค่าระดับสูงจะทำให้เซิร์ฟเวอร์ Apache ของคุณช้าลงอย่างมาก! ใช้ไฟล์บันทึกการเขียนซ้ำในระดับที่มากกว่า 2 สำหรับการดีบักเท่านั้น! ระดับ 9 จะบันทึกรายละเอียด rewritelog เกือบทุกรายการ


UPDATE

มีการเปลี่ยนแปลงใน Apache 2.4:

จากการอัปเกรดเป็น 2.4 จาก 2.2

RewriteLogและRewriteLogLevelสั่งได้ถูกลบออก ขณะนี้ฟังก์ชันนี้มีให้โดยการกำหนดค่าระดับการบันทึกที่เหมาะสมสำหรับโมดูล mod_rewrite โดยใช้คำสั่งLogLevel โปรดดูส่วนการบันทึก mod_rewrite

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับ LogLevel โปรดดูLogLevel Directive

คุณสามารถทำได้

RewriteLog "/path/to/rewrite.log"

ในลักษณะนี้ตอนนี้

LogLevel debug rewrite_module:debug

โอเคปัญหาคือฉันกำลังพยายามเพิ่ม rewriterule ให้กับไฟล์. htaccess และด้วยเหตุผลบางประการจึงไม่ได้ใช้งาน
macha

@macha ลองใช้วิธีข้างต้น หากคุณได้รับข้อผิดพลาดภายในเซิร์ฟเวอร์แสดงว่าเปิดใช้งาน mod_rewrite (.htaccess) คุณอยู่ในโฮสต์ที่ใช้ร่วมกันหรือไม่?
ThinkingMonkey

ไม่ฉันกำลังทำงานกับ localhost ของฉันคุณมีความคิดหรือไม่ว่าไฟล์. htaccess จะโหลดเมื่อใด แม้ว่า apache จะอ่านสิ่งนี้เป็นครั้งแรก
macha

@macha ไฟล์. htaccess ไม่เคยโหลด เข้าถึงได้ (ถ้ามี) โดย apache เมื่อคุณพยายามเข้าถึงเพจที่มีอยู่ในโฟลเดอร์นั้น
ThinkingMonkey

ตกลงคำถามของฉันคือถ้ามีคนขอหน้าเว็บ apache จะดึงสคริปต์ฝั่งเซิร์ฟเวอร์โดยตรงหรือจะมองหาไฟล์. htaccess ในโฟลเดอร์นั้นแล้วดำเนินการต่อ ??
macha

52

คำตอบ "ป้อนค่าขยะ" ไม่ได้หลอกลวงฉันไซต์ของฉันยังคงโหลดต่อไปแม้ว่าจะมีขยะที่ป้อนก็ตาม

แต่ฉันเพิ่มบรรทัดต่อไปนี้ที่ด้านบนของไฟล์. htaccess:

deny from all

วิธีนี้จะแจ้งให้คุณทราบอย่างรวดเร็วว่ามีการดึง. htaccess หรือไม่ หากมีการใช้. htaccess ไฟล์ในโฟลเดอร์นั้นจะไม่โหลดเลย


4
นี่คือการทดสอบที่ง่ายที่สุดหากคุณไม่คิดว่าจะไม่มีอะไรทำงานสักสองสามวินาทีในขณะที่คุณยืนยัน
Mordred

1
ใช่ - ฉันใช้เวลาประมาณหนึ่งวินาทีในการตรวจสอบว่าไซต์ที่ฉันทำงานอยู่ไม่ได้ใช้ไฟล์. htaccess
bonh

1
ขอบคุณทำงานได้อย่างมีเสน่ห์ :) ช่วยฉันในการแก้ไขจุดบกพร่อง!
Martijn van Hoof

32

โดยทั่วไปการเปลี่ยนแปลงใด ๆ ใน. htaccess ควรมีผลกระทบที่มองเห็นได้ หากไม่มีผลให้ตรวจสอบไฟล์ apache การกำหนดค่าของคุณเช่น:

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

ควรเปลี่ยนเป็น

AllowOverride All

และคุณจะสามารถเปลี่ยนคำสั่งในไฟล์. htaccess


ขอบคุณ ฉันพบส่วนที่เกี่ยวข้องในไฟล์ apache2.conf หลักสำหรับแผนผังไดเรกทอรี / var / www
Tim Richardson

6

บางทีวิธีการที่สมเหตุสมผลกว่านั้นคือการสร้างไฟล์ (เช่น test.html) เพิ่มเนื้อหาบางส่วนจากนั้นลองตั้งเป็นหน้าดัชนี:

DirectoryIndex test.html

โดยส่วนใหญ่กฎ. htaccess จะแทนที่การกำหนดค่า Apache ซึ่งทำงานที่ระดับไดเร็กทอรี / ไฟล์


4

ในการตอบคำถามแรกของคำถามทั้งสามข้อวิธีง่ายๆในการดูว่าไฟล์. htaccess ใช้งานได้หรือไม่คือทริกเกอร์ข้อผิดพลาดที่กำหนดเองที่ด้านบนของไฟล์. htaccess:

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

เกี่ยวกับคำถามที่สองของคุณถ้า htaccess ไฟล์ไม่ได้ถูกอ่านก็เป็นไปได้ว่าการกำหนดค่า Apache หลักของเซิร์ฟเวอร์ได้ตั้งค่าให้AllowOverride Noneเอกสารของ Apache มีคำแนะนำในการแก้ไขปัญหาสำหรับกรณีดังกล่าวและกรณีอื่น ๆ ที่อาจป้องกันไม่ให้. htaccess มีผล

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

ส่งออกตัวแปรที่คุณอ้างอิงเพื่อให้แน่ใจว่ามีค่าตามที่คุณคาดหวัง:

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

ทดสอบนิพจน์อย่างอิสระโดยใส่ไว้ใน<If>Directive สิ่งนี้ช่วยให้คุณมั่นใจได้ว่านิพจน์ของคุณเขียนถูกต้องหรือตรงกันเมื่อคุณคาดว่าจะ:

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

ขอให้มีความสุขกับการดีบัก. htaccess!


3

หากคุณสามารถเข้าถึงไดเร็กทอรี apache bin คุณสามารถใช้ได้

httpd -M เพื่อตรวจสอบโมดูลที่โหลดก่อน

 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)

หลังจากนั้นคำสั่งง่ายๆเช่นOptions -Indexesหรือdeny from allจะทำให้. htaccess ทำงานได้อย่างถูกต้อง



-1

ทำไมไม่ใส่ขยะในไฟล์. htaccess ของคุณแล้วลองโหลด apache ใหม่ หาก apache ไม่สามารถเริ่มต้นคุณรู้ว่ามันใช้งานได้ ลบขยะแล้วโหลด apache ใหม่ถ้าโหลดแสดงว่าคุณกำหนดค่า. htaccess ถูกต้อง


7
ฉันไม่คิดว่า Apache จะไม่สามารถเริ่มต้นหรือทำงานได้หากมี. htaccess ที่ไม่ดีเนื่องจากไม่ได้ตรวจสอบ. htaccess จนกว่าจะมีการร้องขอหน้า
Andrew
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.