Як змусити всі 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

EDIT: Коли я спробую правила переписати нижче, я отримую цю помилку:

[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: О, це повний вміст /index.php. Коли я видаляю правила перезапису, він виводить '/' або '/index.php', або я отримую 404 для чого-небудь іншого.

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

ВИРІШИЛИ: Я додав / вперед перед index.php у правилі переписання, а потім воно спрацювало:

РЕШЕНО ПРОТИ: Виявляється / було потрібно лише тому, що я працював 2.2.4. Коли я оновив до 2.2.11, / більше не потрібен.


Який набір правил ви використовували? Я спробував і те, і інше добре працює. Ви впевнені, що у вас активовано mod_rewrite?
Мануель Фокс

Сервер не запускався, якби 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? Я думаю, що так, бо в іншому випадку він не почнеться через синтаксичну помилку.
Мануель Фокс

Редагування показує точний запит: localhost: 8181 та localhost: 8181 / abc . Якщо я видаляю правила перезапису, я отримую свій index.php з / і нормальний 404 з / abc.
jmucchiello

Я додав а / перед index.php, і це вирішило проблему.
jmucchiello

Таємничий ... Я тестував без косого кута, і він працював на мене з апачем-2.2.11-8.
Мануель Фокс

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.