Как системы 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, / больше не понадобилось.
Если вы используете 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.
В приведенном ниже коде используется 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.