.htaccess ปัญหา php $ _SERVER ['PATH_INFO'] ว่างเปล่า [ปิด]
บนโฮสต์ท้องถิ่นฉันกำลังเรียกใช้แอปพลิเคชัน php (MVC) โดยมีกฎต่อไปนี้ใน.htaccessไฟล์ของฉัน:
Options -Indexes
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond $1 !^(config|core|css|js|fonts|images|robots\.txt) RewriteRule ^(.+)$ index.php/$1 [L]
เช่นlocalhost/myapp/register/loginจะโหลดหน้าล็อกอิน แต่ในเซิร์ฟเวอร์ที่ใช้งานจริงฉันมีปัญหา No input file specifiedปัญหาแรกที่ฉันได้พบคือ อ่านคำตอบนี้ผมเปลี่ยนบรรทัดนี้ไปRewriteRule ^(.+)$ index.php/$1 [L] RewriteRule ^(.*)$ index.php?/$1 [L]วิธีนี้แก้ปัญหาแรกได้ แต่สร้างปัญหาอื่นขึ้นมาและตอนนี้ก็โหลดมุมมองและตัวควบคุมเดียวกัน / เริ่มต้นเสมอไม่ว่า URL จะเป็นอย่างไร
index.php ของฉันมีโค้ดบรรทัดต่อไปนี้:
$url = isset($_SERVER['PATH_INFO']) ? explode('/', ltrim($_SERVER['PATH_INFO'], '/')) : [];
// Route the request
Router::route($url);
ดังนั้นฉันจึงตรวจสอบค่า $ _SERVER ['PATH_INFO'] แล้วมันว่างเปล่า ตอนนี้คำถามของฉันคือเหตุใดจึงว่างเปล่าและฉันจะบรรลุพฤติกรรมปกติของ URL ได้อย่างไร
คำตอบ
ในที่สุดฉันก็ทำงานได้ ใหม่ของฉัน
RewriteRuleคือ. ฉันใช้แทนในไฟล์.RewriteRule ^(.*)$ index.php?/$1 [L,QSA]$_SERVER['REQUEST_URI']$_SERVER['PATH_INFO']index.php
หากคุณใช้$_SERVER['REQUEST_URI']ในโค้ด PHP ของคุณคุณอาจไม่ควรต่อท้ายสตริงข้อความค้นหา (ที่มีเส้นทาง URL) กับการRewriteRule แทนที่ (อย่างน้อยคุณก็ไม่จำเป็นต้องทำ) เช่น เพียงใช้RewriteRule . index.php [L]แทน
$_SERVER['REQUEST_URI']superglobal PHP มีการร้องขอ URL เส้นทางเท่านั้นไม่ว่าคุณจะRewriteRuleสั่ง นอกจากนี้ยังมีสตริงการสืบค้นที่เป็นไปได้ (ซึ่งพูดอย่างเคร่งครัดว่าคุณควรแยกโค้ด PHP ของคุณ) (ไม่เหมือนกับตัวแปรเซิร์ฟเวอร์ Apache ที่มีชื่อเดียวกันซึ่งมีเฉพาะ URL-path เท่านั้น)
หากคุณเลือกที่จะส่งสตริงข้อความค้นหาแทนเช่นเดียวกับใน "เปลี่ยนแปลง" ของRewriteRuleคุณดูเหมือนว่าคุณไม่จำเป็นต้องเพิ่มคำนำหน้าเครื่องหมายทับ (เนื่องจากคุณลบสิ่งนี้ออกในโค้ด PHP ของคุณ) ตัวอย่างเช่น:
RewriteRule (.*) index.php?$1 [QSA,L]
จากนั้นindex.phpคุณจะมี:
$url = !empty($_SERVER['QUERY_STRING']) ? explode('/',$_SERVER['QUERY_STRING']) : [];
โปรดทราบว่า$_SERVER['QUERY_STRING']จะเสมอตั้งจึงจำเป็นที่จะต้องตรวจสอบมากกว่า!empty()isset()