Как сделать так, чтобы все 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

РЕДАКТИРОВАТЬ: Когда я пытаюсь переписать правила ниже, я получаю эту ошибку:

[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

РЕДАКТИРОВАТЬ: О, это полное содержимое /index.php. Когда я удаляю правила перезаписи, он выводит «/» или «/index.php», или я получаю 404 за все остальное.

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

РЕШЕНО: Я добавил / перед index.php в правиле перезаписи, и тогда это сработало:

Решено снова: Оказывается, / было необходимо только потому, что я работал 2.2.4. Когда я обновился до 2.2.11, / больше не был нужен.

jmucchiello
источник
Какой набор правил вы использовали? Я попробовал их обоих, и оба работают хорошо. Вы уверены, что активировали 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
Таинственный ... Я тестировал без косой черты, и у меня это работало с apache-2.2.11-8.
Мануэль Фо
1

Приведенный ниже код использует Apache mod_rewrite для перезаписи всех 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 .

nabrond
источник
Смотрите редактирование выше. Получение ошибки 400.
jmucchiello
Хотелось бы, чтобы оба ответа были правильными.
jmucchiello