Bagaimana cara membuat semua URL dijalankan melalui satu file PHP?

9

Bagaimana sistem MVC di mana url berada dalam formulir ini memaksa semua permintaan melalui file index.php tunggal?

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

EDIT: Ketika saya mencoba aturan penulisan ulang di bawah ini saya mendapatkan kesalahan ini:

[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

EDIT: Oh, ini adalah konten lengkap dari /index.php. Ketika saya menghapus aturan penulisan ulang, itu menghasilkan '/' atau '/index.php' atau saya mendapatkan 404 untuk hal lain.

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

ASK: Saya menambahkan a / di depan index.php dalam aturan penulisan ulang dan kemudian bekerja:

ASK LAGI: Ternyata / hanya diperlukan karena saya menjalankan 2.2.4. Ketika saya memutakhirkan ke 2.2.11 / tidak lagi diperlukan.

jmucchiello
sumber
Rangkaian aturan mana yang Anda gunakan? Saya sudah mencoba keduanya dan keduanya bekerja dengan baik. Apakah Anda yakin mod_rewrite telah diaktifkan?
Manuel Faux
Server tidak akan memulai jika mod_rewrite tidak aktif. Ini adalah Apache 2.2 di WinXP jika itu penting.
jmucchiello

Jawaban:

12

Jika Anda menggunakan Apache, gunakan penulisan ulang melalui mod_rewrite:

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

Ini akan menulis ulang URL Anda ke »index.php? Q = foo / bar / baz« transparan.

Baris 2. dan 3. memberi tahu mesin penulisan ulang untuk tidak menulis ulang URL jika menunjuk ke file atau direktori yang ada. Ini diperlukan untuk memiliki akses ke file nyata yang disediakan oleh server httpd.

Manuel Faux
sumber
Lihat edit di atas. Mendapatkan kesalahan 400.
jmucchiello
Apa permintaan persisnya yang Anda kirim ke server? Apakah server Anda memasang mod_rewrite? Saya kira begitu, karena kalau tidak, itu tidak akan mulai karena kesalahan sintaks.
Manuel Faux
Hasil edit menunjukkan permintaan yang tepat: localhost: 8181 dan localhost: 8181 / abc . Jika saya menghapus aturan penulisan ulang saya mendapatkan index.php saya dengan / dan 404 normal dengan / abc.
jmucchiello
Saya menambahkan / di depan index.php dan itu memperbaiki masalah.
jmucchiello
Misterius ... Saya sudah menguji tanpa garis miring dan itu bekerja untuk saya dengan apache-2.2.11-8.
Manuel Faux
1

Kode di bawah ini menggunakan mod_rewrite Apache untuk menulis ulang semua URL yang tidak mengarah ke file fisik atau direktori untuk dipetakan ke index.php. Hasil akhirnya adalah:

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

Aturan penulisan ulang:

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

Penjelasan:

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

Kedua baris di atas menentukan bahwa aturan ini tidak berlaku untuk file biasa (-f) atau direktori (-d).

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

Informasi lebih lanjut tentang cara membuat aturan mod_rewrite dapat dikumpulkan dari situs web Apache: http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html .

nabrond
sumber
Lihat edit di atas. Mendapatkan kesalahan 400.
jmucchiello
Saya berharap saya dapat menetapkan kedua jawaban sebagai benar.
jmucchiello