.htaccess ปัญหา php $ _SERVER ['PATH_INFO'] ว่างเปล่า [ปิด]

Sep 01 2020

บนโฮสต์ท้องถิ่นฉันกำลังเรียกใช้แอปพลิเคชัน 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 ได้อย่างไร

คำตอบ

MrWhite Sep 03 2020 at 17:03

ในที่สุดฉันก็ทำงานได้ ใหม่ของฉัน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()