มีปัญหาเล็กน้อยที่นี่ ...
ในแต่ละไดเร็กทอรี .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" ของคุณคาดหวัง