มีปัญหาเล็กน้อยที่นี่ ...
ในแต่ละไดเร็กทอรี .htaccess บริบท เส้นทาง URL ที่จับคู่โดย เขียนกฎใหม่ ลวดลาย ไม่เคยขึ้นต้นด้วยเครื่องหมายทับ ดังนั้น regex ^/(.*):(.*) จะไม่ตรงกันและคำสั่งไม่ทำอะไรเลย ดังนั้น เขียนกฎใหม่ ลวดลาย จะต้องเป็น ^(.*):(.*) - ไม่มีคำนำหน้าทับ
- อย่างไรก็ตาม regex นี้ดีมาก ทั่วไป และน่าจะเข้าคู่กันมากเกินไป หากคุณกำลังคาดหวังคำขอของแบบฟอร์ม
/1:1, เช่น. /<หมายเลข>:<หมายเลข> จากนั้นใช้ regex ที่เฉพาะเจาะจงมากขึ้น เช่น ^\d+:\d+$
เนื่องจากคุณได้รับ 403 Forbidden (ตรงข้ามกับ 404 Not Found) ฉันถือว่าคุณอยู่บนเซิร์ฟเวอร์ Windows "ปัญหา" ในที่นี้ก็คือ : (ทวิภาค) ไม่ใช่อักขระที่ถูกต้องในชื่อไฟล์ Windows นี่เป็นปัญหาเกี่ยวกับ .htaccess เนื่องจากคำขอถูกแมปกับระบบไฟล์มาก่อน .htaccess (และ mod_rewrite) ได้รับการประมวลผล - เมื่อถึงจุดที่ 403 จะถูกเรียกใช้ คุณจะต้องเขียนคำขอใหม่ในการกำหนดค่าเซิร์ฟเวอร์หลัก (หรือคอนเทนเนอร์ VirtualHost) แทน ซึ่งจะเกิดขึ้น ก่อน คำขอถูกแมปกับระบบไฟล์
ดังนั้น สิ่งที่คุณกำลังพยายามทำ... เขียนคำขอใหม่ที่มีโคลอนโดยใช้ .htaccess บนเซิร์ฟเวอร์ Windows ไม่สามารถทำได้ คุณสามารถทำได้บน Linux (ที่อนุญาตทวิภาคในชื่อไฟล์) หรือในการกำหนดค่าเซิร์ฟเวอร์หลัก (เซิร์ฟเวอร์ หรือ โฮสต์เสมือน บริบท) บน Windows แต่ ไม่ได้อยู่ใน .htaccess.
เมื่อใช้ mod_rewrite ในไฟล์ เซิร์ฟเวอร์ (หรือ โฮสต์เสมือน) บริบท (ตรงข้ามกับ .htaccess) คุณ ทำ ต้องการคำนำหน้าเครื่องหมายทับ (ทั้ง ลวดลาย และ การแทน สตริง) ตัวอย่างเช่น:
# ในบริบท "เซิร์ฟเวอร์" (หรือ "โฮสต์เสมือน")
# ไม่ใช่ ".htaccess" (หรือส่วน "<Directory>" ในการกำหนดค่าเซิร์ฟเวอร์)
RewriteEngine เปิดอยู่
# เขียนใหม่ภายใน "/1:1" เป็นเส้นทางข้อมูลใน "index.php"
RewriteRule ^/\d+:\d+$ /index.php$0 [L]
เดอะ $0 การอ้างอิงย้อนกลับมีเส้นทาง URL ทั้งหมดที่บันทึกโดย เขียนกฎใหม่ ลวดลาย. ซึ่งรวมถึงคำนำหน้าเครื่องหมายทับ (เมื่อใช้ใน a เซิร์ฟเวอร์ บริบท) ซึ่งเป็นสาเหตุที่ละเว้นเครื่องหมายทับใน การแทน สตริง
อัปเดต:
ฉันทำการเปลี่ยนแปลงแล้ว โปรดดูคำถามของฉันอีกครั้งและดูว่าฉันป้อนถูกต้องหรือไม่
<VirtualHost *:80>
ServerName localhost
ServerAlias localhost
DocumentRoot "${INSTALL_DIR}/www"
<Directory "${INSTALL_DIR}/www/">
Options +Indexes +Includes +FollowSymLinks +MultiViews
AllowOverride all
Order Allow,Deny
Allow from all
</Directory>
</VirtualHost>
ดูเหมือนคุณไม่ได้ทำการเปลี่ยนแปลงใดๆ อย่างน้อยไม่ได้อยู่ในส่วนที่ถูกต้อง? ดังที่กล่าวไว้ข้างต้น คำสั่งเหล่านี้จำเป็นต้องเพิ่มโดยตรงไปยัง <VirtualHost> คอนเทนเนอร์ (ที่คุณโพสต์ไว้) ไม่สามารถเพิ่มลงใน .htaccess ไฟล์บนระบบปฏิบัติการ Windows - พวกเขาจะไม่ทำอะไรเลยและคุณจะได้รับการตอบกลับที่ต้องห้าม 403 ตามที่ระบุไว้
ด้านบนควรเขียนดังนี้:
<VirtualHost *:80>
ServerName localhost
ServerAlias localhost
DocumentRoot "${INSTALL_DIR}/www"
# Enable the rewrite engine in a virtualhost context
RewriteEngine On
# Internally rewrite "/1:1" to path-info on "index.php"
RewriteRule ^/\d+:\d+$ /index.php$0 [L]
<Directory "${INSTALL_DIR}/www/">
Options -Indexes -Includes +FollowSymLinks -MultiViews
AllowOverride all
Require all granted
</Directory>
</VirtualHost>
คุณจะต้องรีสตาร์ท Apache เพื่อให้การเปลี่ยนแปลงเหล่านี้มีผล (ไม่เหมือน .htaccess ไฟล์ที่แปลในขณะรันไทม์)
อย่างไรก็ตาม คุณมีแนวทางอื่นใดอีกบ้าง .htaccess และ URL อื่นๆ ของคุณถูกกำหนดเส้นทางอย่างไร คุณโพสต์คำสั่งต่อไปนี้ในความคิดเห็น:
RewriteRule ^(.+)$ index.php?url=$1 [QSA,L]
ซึ่งกำหนดเส้นทาง URL ค่อนข้างแตกต่างจากที่คุณขอในคำถาม ในคำถามของคุณ คุณกำลังส่งเส้นทาง URL เป็นข้อมูลเส้นทางเพิ่มเติมไป index.php. อย่างไรก็ตาม ในคำสั่งนี้ คุณกำลังส่ง URL เป็นส่วนหนึ่งของสตริงข้อความค้นหา? สิ่งเหล่านี้เกี่ยวข้องกันอย่างไร? ทำไมพวกเขาถึงแตกต่างกัน? เห็นได้ชัดว่าคุณต้องส่ง URL ในลักษณะที่ "แอปพลิเคชัน MVC" ของคุณคาดหวัง