ฉันจะทำให้ URL ทั้งหมดทำงานผ่านไฟล์ PHP ไฟล์เดียวได้อย่างไร


9

ระบบ MVC ที่ URL อยู่ในรูปแบบเหล่านี้บังคับให้คำขอทั้งหมดผ่านไฟล์ index.php ไฟล์เดียวได้อย่างไร

http://www.example.com/foo/bar/baz
http://www.example.com/goo/car/caz/SEO-friendly-name-of-the-object
http://www.example.com/hey/you

แก้ไข: เมื่อฉันลองกฎการเขียนด้านล่างฉันได้รับข้อผิดพลาดนี้:

[error] [client 127.0.0.1] Invalid URI in request GET / HTTP/1.1
[error] [client 127.0.0.1] Invalid URI in request GET /abc HTTP/1.1

แก้ไข: โอ้นี่เป็นเนื้อหาที่สมบูรณ์ของ /index.php เมื่อฉันลบกฎการเขียนซ้ำมันจะส่งออก '/' หรือ '/index.php' หรือฉันได้รับ 404 สำหรับสิ่งอื่นใด

<?php
echo htmlspecialchars($_SERVER['REQUEST_URI']);
?>

แก้ไขแล้ว: ฉันเพิ่ม a / ด้านหน้าของ index.php ในกฎการเขียนซ้ำและจากนั้นก็ใช้งานได้:

แก้ไขแล้วอีกครั้ง: เปิด / จำเป็นเพียงเพราะฉันใช้ 2.2.4 เมื่อฉันอัพเกรดเป็น 2.2.11 the / ก็ไม่จำเป็นอีกต่อไป


คุณใช้กฎชุดใด ฉันลองทั้งคู่แล้วก็ใช้ได้ดี คุณแน่ใจหรือไม่ว่าคุณเปิดใช้งาน mod_rewrite
30729 Manuel Faux

เซิร์ฟเวอร์จะไม่เริ่มทำงานหาก mod_rewrite ไม่ทำงาน นี่คือ Apache 2.2 บน WinXP ถ้าเป็นเช่นนั้น
jmucchiello

คำตอบ:


12

หากคุณใช้ Apache ใช้งานเขียนใหม่ผ่านmod_rewrite:

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php?q=$1 [L,QSA]

สิ่งนี้จะเขียน URL ของคุณไปที่» index.php? q = foo / bar / baz «โปร่งใส

บรรทัดที่ 2. และ 3. บอกให้เอ็นจิ้นเขียนใหม่ไม่ให้เขียน URL ซ้ำถ้ามันชี้ไปที่ไฟล์หรือไดเรกทอรีที่มีอยู่ สิ่งนี้จำเป็นต้องมีการเข้าถึงไฟล์จริงที่จัดทำโดยเซิร์ฟเวอร์ httpd


ดูการแก้ไขด้านบน รับข้อผิดพลาด 400
jmucchiello

คำขอที่แน่นอนที่คุณส่งไปยังเซิร์ฟเวอร์คืออะไร เซิร์ฟเวอร์ของคุณติดตั้ง mod_rewrite หรือไม่ ฉันเดาเช่นนั้นเพราะไม่เช่นนั้นจะไม่เริ่มทำงานเนื่องจากข้อผิดพลาดทางไวยากรณ์
Manuel Faux

แก้ไขการแสดงคำขอที่แน่นอน: localhost: 8181และlocalhost: 8181 / abc หากฉันลบกฎการเขียนซ้ำฉันจะได้รับ index.php ด้วย / และ 404 ปกติด้วย / abc
jmucchiello

ฉันเพิ่ม a / ด้านหน้าของ index.php และแก้ไขปัญหา
jmucchiello

ลึกลับ ... ฉันได้ทำการทดสอบโดยไม่ใช้สแลชและมันใช้งานได้กับ apache-2.2.11-8
Manuel Faux

1

รหัสด้านล่างใช้ mod_rewrite ของ Apache เพื่อเขียน URL ทั้งหมดที่ไม่ได้ชี้ไปยังไฟล์หรือไดเรกทอรีที่จะจับคู่กับ index.php ผลลัพธ์ที่ได้คือ:

http://www.example.com/index.php/foo/bar/baz
http://www.example.com/index.php/goo/car/caz/SEO-friendly-name-of-the-object
http://www.example.com/index.php/hey/you

กฎการเขียนซ้ำ:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [PT,L,QSA]

คำอธิบาย:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

ทั้งสองบรรทัดข้างต้นบอกว่ากฎนี้ใช้ไม่ได้กับไฟล์ปกติ (-f) หรือไดเรกทอรี (-d)

RewriteRule ^(.*)$ index.php/$1 [PT,L,QSA]

ข้อมูลเพิ่มเติมเกี่ยวกับวิธีการสร้างกฎ mod_rewrite สามารถรวบรวมได้จากเว็บไซต์ของ Apache: http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html


ดูการแก้ไขด้านบน รับข้อผิดพลาด 400
jmucchiello

ฉันหวังว่าฉันสามารถตั้งค่าคำตอบทั้งสองให้ถูกต้อง
jmucchiello
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.