ผู้โพสต์หลายคนมีปัญหาในการดีบักคำสั่ง RewriteRule และ RewriteCond ภายใน.htaccessไฟล์ สิ่งเหล่านี้ส่วนใหญ่ใช้บริการโฮสติ้งที่ใช้ร่วมกันดังนั้นจึงไม่มีสิทธิ์เข้าถึงการกำหนดค่าเซิร์ฟเวอร์รูท พวกเขาไม่สามารถหลีกเลี่ยงการใช้.htaccessไฟล์สำหรับการเขียนใหม่และไม่สามารถเปิดใช้ RewriteLogLevel "ตามที่ผู้ตอบแบบสอบถามแนะนำจำนวนมากนอกจากนี้ยังมี.htaccessข้อผิดพลาดและข้อ จำกัด เฉพาะหลายประการที่ไม่ครอบคลุมเช่นกัน .
ดังนั้น Q ของฉันที่นี่คือวิธีที่เราอยากจะแนะนำให้พวกเขาแก้ปัญหากฎของตัวเอง ฉันให้คำแนะนำด้านล่าง ข้อเสนอแนะอื่น ๆ จะได้รับการชื่นชม
เข้าใจว่าเอ็นจิ้น mod_rewrite วนไปตาม
.htaccessไฟล์ต่างๆ เครื่องยนต์รันลูปนี้: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ดังนั้นกฎของคุณจะถูกดำเนินการซ้ำ ๆ และหากคุณเปลี่ยนพา ธ URI มันอาจสิ้นสุดการเรียกใช้
.htaccessไฟล์อื่นหากมีอยู่ ดังนั้นตรวจสอบให้แน่ใจว่าคุณยุติลูปนี้ถ้าจำเป็นโดยการเพิ่มพิเศษRewriteCondเพื่อหยุดกฏการยิง ลบชุด.htaccessกฎการเขียนระดับล่าง ๆยกเว้นกรณีที่ต้องการใช้ชุดกฎหลายระดับอย่างชัดเจนตรวจสอบให้แน่ใจว่าไวยากรณ์ของ Regexp แต่ละรายการนั้นถูกต้องโดยการทดสอบกับชุดรูปแบบการทดสอบเพื่อให้แน่ใจว่าเป็นไวยากรณ์ที่ถูกต้องและทำตามที่คุณต้องการพร้อมกับการทดสอบ URI ทั้งหมด ดูคำตอบด้านล่างสำหรับรายละเอียดเพิ่มเติม
สร้างกฎของคุณเพิ่มขึ้นในไดเรกทอรีทดสอบ คุณสามารถใช้ "เรียกใช้
.htaccessไฟล์ที่ลึกที่สุดในฟีเจอร์พา ธ " เพื่อตั้งค่าไดเรกทอรีทดสอบแยก (ต้นไม้) และดีบักชุดกฎที่นี่โดยไม่ทำให้กฎหลักของคุณเสียและหยุดเว็บไซต์ของคุณทำงาน คุณต้องเพิ่มพวกเขาทีละคนเพราะนี่เป็นวิธีเดียวที่จะ จำกัด วงความล้มเหลวของแต่ละกฎใช้ต้นขั้วสคริปต์หุ่นการถ่ายโอนข้อมูลจากเซิร์ฟเวอร์และสิ่งแวดล้อมตัวแปร (ดูรายชื่อ 2 ) หากแอปของคุณใช้พูด
blog/index.phpคุณสามารถคัดลอกสิ่งนี้ลงในtest/blog/index.phpและใช้เพื่อทดสอบกฎบล็อกของคุณในtestไดเรกทอรีย่อย คุณยังสามารถใช้ตัวแปรสภาพแวดล้อมเพื่อให้แน่ใจว่าเอ็นจินการเขียนใหม่ในการตีความสตริงการแทนที่อย่างถูกต้องเช่นRewriteRule ^(.*) - [E=TEST0:%{DOCUMENT_ROOT}/blog/html_cache/$1.html]และค้นหาตัวแปรREDIRECT_ *เหล่านี้ในการถ่ายโอนข้อมูล phpinfo BTW ฉันใช้สิ่งนี้และค้นพบในเว็บไซต์ของฉันที่ฉันต้องใช้
%{ENV:DOCUMENT_ROOT_REAL}แทน ในกรณีของการเปลี่ยนเส้นทางวนลูป REDIRECT_REDIRECT_ *รายการรหัสผ่านก่อนหน้า ฯลฯ ..ตรวจสอบให้แน่ใจว่าคุณไม่ได้รับกัดโดยเบราว์เซอร์ของคุณไม่ถูกต้องแคช 301 เปลี่ยนเส้นทาง ดูคำตอบด้านล่าง ขอบคุณUlrich Palhaสำหรับเรื่องนี้
เอ็นจินการเขียนซ้ำดูเหมือนว่ามีความไวต่อกฎที่เรียงซ้อนภายใน
.htaccessบริบท (นั่นคือที่ที่RewriteRuleผลลัพธ์ในการทดแทนและสิ่งนี้ตกลงไปถึงกฎเพิ่มเติม) เนื่องจากฉันพบข้อบกพร่องที่มีคำขอย่อยภายใน(1)และการประมวลผลPATH_INFO ที่ไม่ถูกต้องได้รับการป้องกันโดยการใช้ธง [NS], [L] และ [PT]
มีข้อคิดเห็นหรือข้อเสนอแนะเพิ่มเติมอีกหรือไม่
รายการ 1 - phpinfo
<?php phpinfo(INFO_ENVIRONMENT|INFO_VARIABLES);