Tüm URL'leri tek bir PHP dosyası üzerinden nasıl çalıştırabilirim?


9

URL'lerin bu formlarda olduğu MVC sistemleri tüm istekleri tek bir index.php dosyası üzerinden nasıl zorlar?

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: Aşağıdaki yeniden yazma kurallarını denediğinizde bu hatayı alıyorum:

[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, bu /index.php tam içeriği. Yeniden yazma kurallarını kaldırdığımda, '/' veya '/index.php' çıktısı veriyor veya başka bir şey için 404 alıyorum.

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

ÇÖZÜLDÜ: Yeniden yazma kuralında index.php'nin önüne / ekledim ve sonra çalıştı:

TEKRAR ÇÖZÜLDÜ: Yalnızca gerekli 2.2.4 çalıştırdığım için / gerekli olduğu ortaya çıktı. 2.2.11'e yükseltme yaptığımda / artık gerekmiyordu.


Hangi kuralları kullandınız? İkisini de denedim ve ikisi de iyi çalışıyor. Mod_rewrite'ı etkinleştirdiğinizden emin misiniz?
Manuel Faux

Mod_rewrite aktif olmasaydı sunucu başlamazdı. Bu önemliyse WinXP'de Apache 2.2'dir.
jmucchiello

Yanıtlar:


12

Apache kullanıyorsanız, yeniden yazma yöntemini şu yolla kullanın mod_rewrite:

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

Bu URL'lerinizi şeffaf bir şekilde »index.php? Q = foo / bar / baz« 'a yeniden yazacaktır.

2. ve 3. satırları, yeniden yazma motoruna varolan bir dosya veya dizini gösteriyorsa URL'yi yeniden yazmamasını söyler. Httpd sunucusu tarafından sağlanan gerçek dosyalara erişim için bu gereklidir.


Yukarıdaki düzenlemeye bakın. Hata 400.
jmucchiello

Sunucuya gönderdiğiniz tam istek neydi? Sunucunuzda mod_rewrite kurulu mu? Sanırım öyle, çünkü aksi takdirde bir sözdizimi hatası nedeniyle başlamaz.
Manuel Faux

Düzenleme tam talebi gösterir: localhost: 8181 ve localhost: 8181 / abc . Yeniden yazma kurallarını kaldırırsam index.php dosyamı / ile ve normal 404 / abc ile alırım.
jmucchiello

İndex.php önüne bir / ekledim ve bu sorunu çözdü.
jmucchiello

Gizemli ... Eğik çizgi olmadan test ettim ve apache-2.2.11-8 ile benim için çalıştı.
Manuel Faux

1

Aşağıdaki kod, index.php ile eşlenecek fiziksel bir dosyaya veya dizine işaret etmeyen tüm URL'leri yeniden yazmak için Apache'nin mod_rewrite komutunu kullanır. Sonuç:

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

Yeniden yazma kuralı:

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

Açıklama:

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

Yukarıdaki satırların her ikisi de bu kuralın normal dosyalar (-f) veya dizinler (-d) için geçerli olmadığını belirtir.

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

Mod_rewrite kurallarının nasıl oluşturulacağı hakkında daha fazla bilgi Apache web sitesinden edinilebilir : http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html .


Yukarıdaki düzenlemeye bakın. Hata 400.
jmucchiello

Her iki yanıtı da doğru olarak belirleyebilsem.
jmucchiello
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.