ฉันมีเซิร์ฟเวอร์ Apache ในพื้นที่สำหรับพัฒนาเพจ ดังนั้น ฉันมีโฟลเดอร์รูทที่หน้าต่างๆ ทั้งหมดอยู่ในโฟลเดอร์ย่อย โฟลเดอร์เหล่านั้นมีโฟลเดอร์ย่อยอื่นสำหรับเนื้อหาสาธารณะ ซึ่งอาจขึ้นอยู่กับเฟรมเวิร์ก - โฟลเดอร์อื่น (เช่น สาธารณะ, wwwroot, webroot, httpdocs)
โครงสร้างโฟลเดอร์:
/
|--srv
|--http
|--หน้า
| |--เว็บรูท
| |-- .htaccess
| |--index.php
|--หน้า2
|--สาธารณะ
|--index.php
ตอนนี้แทนที่จะใช้ http://localhost/page/webroot ฉันต้องการใช้ http://page.localhost/ รูปแบบ URL เนื่องจากควรจะเหมือนในโลกแห่งความเป็นจริง (เช่น ลิงก์ที่ชี้ไปที่รูทควรใช้งานได้ เป็นต้น)
ก่อนอื่นฉันลองด้วย VirtualDocumentRoot /srv/http/%-2/webroot/
ซึ่งดูเหมือนว่าจะทำงานได้ดีถ้าทุกหน้ามีโฟลเดอร์ webroot เป็นโฟลเดอร์สาธารณะ อย่างไรก็ตาม จะไม่ทำงานหากโฟลเดอร์สาธารณะมีชื่ออื่น
วิธีที่สองของฉันคือใช้ mod_rewrite ด้วยสิ่งที่ชอบ:
DocumentRoot /srv/http
RewriteEngine เปิดอยู่
RewriteCond %{HTTP_HOST} (.+)\.[^\.]+$
RewriteCond %{DOCUMENT_ROOT}/%1/webroot -d
RewriteRule ^(.+) %{DOCUMENT_ROOT}/%1/webroot/$1 [L]
(สามารถทำซ้ำ 3 บรรทัดสุดท้ายสำหรับโฟลเดอร์อื่น - ข้ามที่นี่เพื่อความสะดวกในการอ่าน)
มันดูค่อนข้างมีแนวโน้มในตอนเริ่มต้น แต่จากนั้นฉันก็พบว่ามันไม่ทำงานหากหน้านั้นมีไฟล์ .htaccess ที่มี mod_rewrite ในเครื่องซึ่งแมปคำขอทั้งหมดกับ index.php (เช่น บางเฟรมเวิร์กทำ) ในกรณีนี้ mod_rewrite จะทำงานวนซ้ำไม่สิ้นสุด เนื่องจากส่วนไดนามิกของพาธได้รับการปฏิบัติเหมือนกับโฟลเดอร์ย่อย และไม่เหมือนกับ DocumentRoot นี่คือผลลัพธ์จากบันทึก:
https://pastebin.com/4aNgRahx
สิ่งนี้จะทำซ้ำจนกว่าจะถึงขีดจำกัดการเรียกซ้ำ
ไฟล์ .htaccess มีลักษณะดังนี้:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^ index.php [L]
</IfModule>
ถ้าฉันปิดมันจะทำงาน
แล้วตอนนี้ฉันควรทำอย่างไร?
การเปลี่ยน .htaccess หรือไฟล์ใดๆ ในโฟลเดอร์โปรเจ็กต์นั้นไม่ใช่ตัวเลือก เพราะมันจะไม่สามารถใช้งานได้อีกต่อไปในเซิร์ฟเวอร์จริง