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