เพราะเนื่องจากการเปลี่ยนเส้นทางคือ ไม่มีเงื่อนไขคุณสิ้นสุดการเปลี่ยนเส้นทางอีกครั้ง หลังจาก URL ถูกเขียนใหม่ index.php
(ตัวควบคุมด้านหน้าของ WordPress)
เมื่อคุณร้องขอ /somepage.php
:
- คุณถูกนำไปที่
/บางเพจ
(ตามกฎข้อแรก) การตอบสนองการเปลี่ยนเส้นทางจะถูกส่งกลับไปยังไคลเอ็นต์
- ในคำขอที่สอง
/บางเพจ
ถูกเขียนใหม่เป็นการภายใน /index.php
ตามกฎข้อสุดท้าย เครื่องมือเขียนใหม่จะเริ่มต้นใหม่ (ใน a ไดเรกทอรี บริบท)...
/index.php
ถูกเปลี่ยนเส้นทางไปที่ /ดัชนี
(ตามกฎข้อแรก)การตอบสนองการเปลี่ยนเส้นทางจะถูกส่งกลับไปยังไคลเอ็นต์
- ในคำขอที่สาม
/ดัชนี
ถูกเขียนใหม่เป็นการภายใน /index.php
โดยการเขียนซ้ำครั้งล่าสุด เอ็นจิ้นการเขียนใหม่จึงเริ่มต้นใหม่...
- ไปที่ 3 (ติดอยู่ในวงจรการเปลี่ยนเส้นทางที่ไม่มีที่สิ้นสุด)
ใน ไดเรกทอรี บริบท (เช่น .htaccess
) เอ็นจิ้นการเขียนใหม่ไม่ได้ทำเพียงแค่ผ่านสคริปต์เพียงครั้งเดียว มันวนซ้ำจนกว่า URL จะผ่านไปโดยไม่มีการเปลี่ยนแปลง (เว้นแต่คุณจะใช้ จบ
แฟล็กบน Apache 2.4 หรือเกิดการเปลี่ยนเส้นทางภายนอก 3xx)
เปลี่ยนเพื่อเอาออก .html
ใช้งานได้ดีเพราะคุณกำลังเขียนใหม่ /index.php
ซึ่งไม่ลงท้ายด้วย .html
ดังนั้นคำสั่งเปลี่ยนเส้นทาง (ที่ลบ .html
) ไม่ตรงกัน
ในการแก้ปัญหานี้ คุณต้องหลีกเลี่ยงการเปลี่ยนเส้นทางคำขอที่เขียนใหม่ คุณสามารถทำได้โดย:
ใช้ จบ
ตั้งค่าสถานะ (Apache 2.4+) ในการเขียนซ้ำครั้งล่าสุด แทนที่จะเป็น แอล
เพื่อป้องกันการวนซ้ำของเอ็นจิ้นการเขียนใหม่ แม้ว่าคุณควรหลีกเลี่ยงการเปลี่ยนคำสั่ง WordPress ของหุ้น (ดูด้านล่าง) ดังนั้นนี่อาจไม่ใช่ตัวเลือกที่ต้องการ สิ่งนี้ใช้ไม่ได้กับ Apache 2.2
หรือตรวจสอบสำหรับ .php
ต่อ THE_REQUEST
ตัวแปรเซิร์ฟเวอร์ (ซึ่งมีบรรทัดเริ่มต้นของส่วนหัวคำขอ HTTP และไม่เปลี่ยนแปลงเมื่อมีการเขียนคำขอใหม่) ตัวอย่างเช่น:
# ลบส่วนขยาย ".php" ในคำขอ "โดยตรง" (ไม่เขียนซ้ำ) เท่านั้น
RewriteCond %{THE_REQUEST} [A-Z]{3,7}\s/[^?]+\.php(?:\?|\s|$) [NC]
RewriteRule (.+)\.php$ /$1 [R=301,L,NC]
หรือตรวจสอบที่ REDIRECT_STATUS
ตัวแปรสภาพแวดล้อมซึ่งว่างเปล่าในคำขอเริ่มต้นและตั้งค่าเป็น 200 (เช่นเดียวกับสถานะ 200 OK HTTP) ในการเขียนซ้ำครั้งแรกที่สำเร็จ (ซึ่งง่ายกว่า regex ที่ค่อนข้างซับซ้อนด้านบน) ตัวอย่างเช่น:
# ลบส่วนขยาย ".php" ในคำขอ "โดยตรง" (ไม่เขียนซ้ำ) เท่านั้น
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule (.+)\.php$ /$1 [R=301,L,NC]
อย่างไรก็ตาม คุณไม่ควรแก้ไขโค้ดภายใน # เริ่มต้น WordPress
เนื่องจาก WordPress เองพยายามรักษาสิ่งนี้และอาจเขียนทับรหัสนี้ในภายหลัง กฎนี้จำเป็นต้องไป ก่อน เดอะ # เริ่มต้น WordPress
เครื่องหมายความคิดเห็น คุณไม่จำเป็นต้องทำซ้ำ RewriteEngine เปิดอยู่
คำสั่งที่ปรากฏในภายหลังในไฟล์ (ในส่วน WordPress)
คุณจะต้องล้างแคชของเบราว์เซอร์ก่อนทำการทดสอบ เนื่องจากการเปลี่ยนเส้นทางที่ผิดพลาด (ถาวร) อาจถูกแคชโดยเบราว์เซอร์ ทดสอบครั้งแรกกับการเปลี่ยนเส้นทาง 301 (ชั่วคราว) เพื่อหลีกเลี่ยงปัญหาการแคช
อย่างไรก็ตามสิ่งนี้ไม่อนุญาตให้คุณเข้าถึง .php
ไฟล์ที่ไม่มี .php
การขยาย. เนื่องจาก URL ที่ไม่มีส่วนขยายจะต้องถูกเขียนใหม่ภายในกลับไปเป็น .php
ไฟล์.