Консультация № 68284
23.12.2006, 16:06
0.00 руб.
0 2 2
Здравствуйте уважаемые эксперты!
Пишу CMS. Решил организовать систему навигации посредством ЧПУ. Нашел совет по этому делу (код приведен в приложении). Мне нужно чтобы все запросы обрабатывал index.php при этом чтобы не возникало 404 ошибки. Сделал как там сказано, но при этом если запрашивается несуществующий файл, возникает 404 ошибка, но при этом не обрабатываются толком существующие (файл *.css)

Через ErrorDocument 404 - плохое решение.
Начал писать сначало через обработку 404 ошибки, но при ссылке на виртуальный документ как action формы параметры POST уходят в никуда и логи апача растут не по дням а по часам.

Что вы можете предложить мне?
Может я что-то неправильно делаю в .htaccess?

у меня установлен XAMMP 1.5.4:
Apache Version Apache/2.2.3 (Win32) DAV/2 mod_autoindex_color PHP/5.1.6

Заранее благодарен

Приложение:
Содержание файла .htaccessAction throw /index.php<FilesMatch "(.*)"> ForceType throw</FilesMatch><FilesMatch "index.php"> ForceType application/x-httpd-php</FilesMatch>

Обсуждение

Неизвестный
23.12.2006, 16:52
общий
это ответ
Здравствуйте, Semen214!
посмотрите вот тут http://www.egoroff.spb.ru/portfolio/apache/mod_rewrite.html
и тут
http://apachedev.ru/2006/07/31/mod_rewrite-preobrazovanie-dinamicheskih-url-v-staticheskie/

Самой частой проблемой, встречающейся при реализации преобразований URL из динамических в статические - это когда "ломаются" относительные ссылки внутри вашей страницы (на изображения, на CSS файлы и внешние JavaScript). Проблема в том, что клиент (например браузер) сам обрабатывает относительные ссылки. Например, если вы обрабатываете URL product/widget/blue/fuzzy/widgetco, то браузер увидит страницу "widgetco" и будет обрабатывать относительные ссылки этой страницы относительно "виртуального" каталога /product/widget/blue/fuzzy/. Есть два простых решения этой проблемы. Первое - это использовать серверо-относительные ссылки (или абсолютные ссылки), или использовать дополнительные mod_rewrite правила для преобразования URL картинок, CSS файлов и т.п. Вот пример использования серверно-относительной ссылки <img src="/logo.gif">, которая заменяет странично-относительную ссылку <img src="logo.gif">.
Часто оптимальное решение - вписать в <head> базовый тег <base href=”http://site.com/”>.

Вот примерно так выглядит мой .htaccess
###############################
# Запуск mod_rewrite
Options +FollowSymLinks
RewriteEngine on
#

# Внутренние преобразования статических URL в динамические
RewriteRule ^(product)/([0-9]+)/([^/]+)/?$ index.php?dir=$1&god=$2&sezon=$3 [L]
################################

Ссылка вида http://localhost/product/2006/leto/ будет преобразована в
http://localhost/index.php?dir=product&god=2006&sezon=leto
Неизвестный
23.12.2006, 18:19
общий
это ответ
Здравствуйте, Semen214!

А чем Вам не нравится вариант с ErrorDocument 404? По моему специально для такого случая и делалось. Просто перенаправляйте на тот же index.php со специальным параметром. Посмотрите такой вариант (текст файлов в приложении) (css работает нормально, ошибку 404 обрабатывает тот же index.php)

Удачи!

Приложение:
.htaccess:Action throw /index.php<FilesMatch "(.*)"> ForceType throw</FilesMatch><FilesMatch "(.css)"> ForceType .css</FilesMatch><FilesMatch "index.php"> ForceType application/x-httpd-php</FilesMatch>ErrorDocument 404 /index.php?section=error______________________________________________index.php<html><head><meta http-equiv="Content-Type" content="text/html; charset=windows-1251"><title>Страница</title></head><link rel="stylesheet" type="text/css" href="style.css"><body>Вы попали на НАШ САЙТ!
<?phpif (isset($_GET["section"]) & $_GET["section"]==‘error‘) {echo ‘Ошибка 404 - файл не найден!‘;}?></body></index>
Форма ответа