Jak sprawić, by wszystkie adresy URL działały w jednym pliku PHP?

9

W jaki sposób systemy MVC, w których adresy URL znajdują się w tych formularzach, wymuszają wszystkie żądania w jednym pliku 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

EDYCJA: Kiedy próbuję reguł przepisywania poniżej, pojawia się ten błąd:

[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

EDYCJA: Och, to jest pełna zawartość pliku /index.php. Kiedy usuwam reguły przepisywania, wypisuje „/” lub „/index.php” albo otrzymuję 404 za cokolwiek innego.

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

ROZWIĄZANE: Dodałem / przed indeksem.php w regule przepisywania, a potem zadziałało:

ROZWIĄZANE PONOWNIE: Okazało się, że / było potrzebne tylko dlatego, że działałem 2.2.4. Kiedy uaktualniłem do 2.2.11, / nie było już potrzebne.

jmucchiello
źródło
Z którego zestawu zasad korzystałeś? Próbowałem obu z nich i oba działają dobrze. Czy na pewno masz aktywowany mod_rewrite?
Manuel Faux
Serwer nie uruchomi się, jeśli mod_rewrite nie będzie aktywny. To jest Apache 2.2 na WinXP, jeśli to ma znaczenie.
jmucchiello

Odpowiedzi:

12

Jeśli używasz Apache, użyj przepisywania przez mod_rewrite:

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

Spowoduje to przepisanie twoich adresów URL do »index.php? Q = foo / bar / baz« transparentnie.

Wiersze 2. i 3. informują silnik przepisujący, aby nie przepisał adresu URL, jeśli wskazuje na istniejący plik lub katalog. Jest to konieczne, aby mieć dostęp do prawdziwych plików udostępnianych przez serwer httpd.

Manuel Faux
źródło
Zobacz edycję powyżej.
Otrzymuję
Jakie dokładnie żądanie wysłałeś na serwer? Czy twój serwer ma zainstalowany mod_rewrite? Chyba tak, bo inaczej nie uruchomi się z powodu błędu składniowego.
Manuel Faux
Edycja pokazuje dokładne żądanie: localhost: 8181 i localhost: 8181 / abc . Jeśli usunę reguły przepisywania, otrzymam mój index.php z / i normalny 404 z / abc.
jmucchiello
Dodałem / przed index.php i to rozwiązało problem.
jmucchiello
Tajemnicze ... Testowałem bez slash i działało to dla mnie z Apache-2.2.11-8.
Manuel Faux
1

Poniższy kod używa mod_rewrite Apache do przepisania wszystkich adresów URL, które nie wskazują na fizyczny plik lub katalog, który ma zostać zamapowany na index.php. Efektem końcowym będzie:

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

Przepisuj regułę:

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

Wyjaśnienie:

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

Oba powyższe wiersze wskazują, że ta reguła nie ma zastosowania do zwykłych plików (-f) lub katalogów (-d).

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

Więcej informacji na temat tworzenia reguł mod_rewrite można znaleźć na stronie internetowej Apache: http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html .

nabrond
źródło
Zobacz edycję powyżej. Błąd 400.
jmucchiello,
Chciałbym móc ustawić obie odpowiedzi jako poprawne.
jmucchiello