Переделал все ссылки в файлах под ЧПУ
но теперь работаю и ссылки вида: news/02-01-2007/
и ссылки news.php?dt=02012007
как сделать что-бы последние неработали?
может есть какоето правило что-бы допустим написать его в конце htaccess
которое бы проверяло если все предыдущие несработали, то направлять на главную страницу?
по идее, нужно переименовать файл, как уже говорили, а в старом делать переадресацию на новый вид url. но не понятен смысл этого. Страницы всеравно в скором времени переиндексируются
Лично я решил эту проблему иначе. Я не использую кучу правил реврайта на каждый раздел сайта, а использую по сути одно глобальное правило, которое реврайтит любой запрос в глубине корня моего сайта на index.php. А там уже происходит разбор урла ($_SERVER['REQUEST_URI']) и определение какой класс вызывать для обработки запроса, а также обработка ошибок типа 404, 403, 400 и др. При этом .htaccess упрощенно выглядит следующим образом:
В специальных директориях, в которых лежит статический контент типа /css, /js, /images -- я кладу .htaccess, отменяющий представленное выше глобальное правило реврайтинга:
Код:
RewriteEngine off ExpiresActive On ExpiresDefault "access plus 1 day"
(опции Expires* здесь относятся к mod_expires, который я считаю просто незаменимым при работе со статическими файлами)
Плюс моего подхода в том, что я полностью контроллирую обработку входящих HTTP-запросов. URI страниц моего сайта никак не зависят от внутренней структуры сайта и названий скриптов. Полная свобода в том, как обрабатывать тот или иной запрос. И при этом я полностью скрываю от пользователя внутреннюю структуру сайта (за исключением директорий со статическим контентом). Пользователь не может обратиться к php-скриптам напрямую, минуя ЧПУ, реализованное в коде самого сайта. Даже открытие /index.php приведет к ошибке 404 Not Found. Мне не нужно помещать в каталоги с самим сайтом (типа /classes, /includes, /templates и т.п.) файл .htaccess с единственным правилом: "Deny from all". И более того, в ЧПУ моего сайта могут быть пути, которые совпадают с реальными путями на диске в каталоге с сайтом -- и здесь не будет никакого конфликта.
Минусов у моего подхода я вижу два:
1. Небольшой оверхед в нагрузке сервера за счет обработки ошибок типа 404.
2. Несколько более сложная внутренняя реализация за счет того, что нужно самому выполнять обработку всех запросов, т.е. определять ответственный скрипт, тогда как обычно этим занимается сам Apache.
Лично мне мой подход нравится, а перечисленные минусы я считаю приемлимыми для себя. Самое приятное в нем то, что я не только сам решаю как обрабатывать те или иные URI, но и могу достаточно жестко ограничить само множество обрабатываемых URI. В случае с пресловутым переименованием news.php в news2.php вы не сможете запретить пользователю обратиться к скрипту /news2.php напрямую, минуя ЧПУ.
Не задавал, но почему-то ожидал возникновение какой-то дискуссии. Неужели я все так правильно написал, что ни у кого не нашлось ничего ни возразить, ни добавить?
Paul Yanchenko, правильно, то оно всё правильно, но человек изначально сказал:
Цитата:
Переделал все ссылки в файлах под ЧПУ
Т.е. у него был какой-то уже готовый сайт, а теперь он его доработал.
Так же часто происходит с доработкой различных форумов и CMS (phpBB и т.п.), где уже саму структуру системы не изменить, приходится только напильничком внешность подрабатывать.
Кстати, можно не отменять в каждом статичном каталоге предыдущий хтаксес, а вынести это в корневой, например:
Что касается изначального вопроса, то если очень нужно, можно смотреть REQUEST_URI. Если там не чепеушный вид — посылать пользователя, либо переадресовывать на чпу-вариант.
Не задавал, но почему-то ожидал возникновение какой-то дискуссии. Неужели я все так правильно написал, что ни у кого не нашлось ничего ни возразить, ни добавить?
Ты написал: "лично мне мой подход нравится". Я тебе верю. Поскольку твой подход вызывает лично у меня нулевой интерес, а никаких конкретных вопросов ты не задавал -- никаких комментариев я не пишу. Логично?
Кстати, у меня родился вопрос по поводу mod_rewrite. Как создать правило реврайтинга, которое реврайтит URL, содержащий символ '%'? Как его правильно заэкранировать? Перепробовал все известные мне способы экранизации, перечитал доку, провел несколько экспериментов -- никак.
20 Сообщения: 380 Зарегистрирован: 02.01.07 Откуда: у Майкла Дугласа базука?
Добавлено: 19 Сентябрь 2007, 12:01:03
Внесу изюма в диалог
Программировать нужно так, чтобы потом ничего не реврайтить
А то получается, скриптовая часть обрабатывает запросы "так",
а потом между сервером и клиентом идет еще дополнительная обработка по трансформации запросов...
Получается дополнительная нагрузка на CPU и память. А это уже не хорошо.
Программировать нужно так, чтобы потом ничего не реврайтить
Я бы выразился несколько менее категорично: следует стараться выдерживать соответствие между структурой приложения и структурой URL -- это впоследствии облегчает отладку и сопровождение.
Кстати, а на мой вопрос никто не может/не хочет ответить?
> Кстати, у меня родился вопрос по поводу mod_rewrite. Как создать правило реврайтинга, которое реврайтит URL,
> содержащий символ '%'? Как его правильно заэкранировать? Перепробовал все известные мне способы экранизации,
> перечитал доку, провел несколько экспериментов -- никак.
Кстати, у меня родился вопрос по поводу mod_rewrite. Как создать правило реврайтинга, которое реврайтит URL, содержащий символ '%'? Как его правильно заэкранировать? Перепробовал все известные мне способы экранизации, перечитал доку, провел несколько экспериментов -- никак.
Пример, что ли, покажите.
Если вы имеете ввиду "%" в url-кодированных параметрах, то к моменту обработки mod_rewriteом, они уже перекодированы обратно, т.е. вместо %xx, там уже стоит соответствующий символ.
Я просто хотел сделать что-то вроде поддержки русских названий страниц. Чтобы при вводе в адресной строке mydomain.ru/резюме происходил автоматический редирект на mydomain.ru/cv/. Разные браузеры конвертируют спецсимволы в %XX по-разному. Одни используют UTF-8, другие CP1251. Firefox2 почему-то использует CP1251. Вобщем, с CP1251 у меня получилось, а вот с UTF-8 уже почему-то нет. путь "/%D1%80%D0%B5%D0%B7%D1%8E%D0%BC%D0%B5" упорно не хочет матчиться моим реврайтрулом.
весьма странно почему это mod_rewrite делает urldecode(), его ведь об этом никто не просил...
А чего его просить? Ему нужно по папкам сервера идти в соответствии с урлом, явно ему нужны уже раскодированные названия.
Вобще-то, предлагаю еще раз десять подумать, прежде чем делать нелатинские пути. Так уж они нужны? Хотя вот в википедии они нужны. Сейчас проверил на ней IE6, FF2, Opera9, все трое кодируют одинаково в UTF.
Цитата:
путь "/%D1%80%D0%B5%D0%B7%D1%8E%D0%BC%D0%B5" упорно не хочет матчиться моим реврайтрулом.
Сам то htaccess в UTF?
И вообще вы только что рассказывали про "один обработчик всех запросов", почему здесь его не используете?
путь "/%D1%80%D0%B5%D0%B7%D1%8E%D0%BC%D0%B5" упорно не хочет матчиться моим реврайтрулом.
Сам то htaccess в UTF?
Что ты имеешь под этим в виду? В .htaccess у меня уже есть RewriteRule для CP1251 кодировки, стало быть уже ответ -- нет. Но мне-то и нужно создать в одном файле правила для нескольких кодировок.
gro писал(а):
И вообще вы только что рассказывали про "один обработчик всех запросов", почему здесь его не используете?
Да, но тут немного другой случай. Здесь я использую сторонний продукт -- WordPress, и мой метод в нем не используется.
Crazy писал(а):
mod_rewrite не делает "urldecode()". Это обязанность ядра сервера. Немедленно по получении запроса.
А каким образом тогда PHP получает в $_SERVER['REQUEST_URI'] не декодированный URL?
Пример, что ли, покажите. Если вы имеете ввиду "%" в url-кодированных параметрах, то к моменту обработки mod_rewriteом, они уже перекодированы обратно, т.е. вместо %xx, там уже стоит соответствующий символ.
Может подскажете. Очень надо, как-то получить, точно то, что ввёл пользователь в строке браузера.
Фишка в том, что $_SERVER['REQUEST_URI'] возращает "/r_lcdprotector_Разное.html" вместо "/r_lcdprotector_%D0%E0%E7%ED%EE%E5.html". При условии что этот адрес разбирается mod_rewrite.
'noescape|NE' (не экранировать URI при выводе)
Этот флаг не даёт mod_rewrite применять обычные правила экранирования URI к результату преобразования. Обычно, специальные символы (такие как '%', '$', ';', и так далее) будут экранированы их шестнадцатиричными подстановками ('%25', '%24', и '%3B', соответственно); этот флаг не дает это делать. Это позволяет символам процента появлятся на выходе , как в
Код:
RewriteRule /foo/(.*) /bar?arg=P1\%3d$1 [R,NE]
для которого '/foo/zed' преобразовывалось бы в безопасный запрос '/bar?arg=P1=zed'.
Фишка в том, что $_SERVER['REQUEST_URI'] возращает "/r_lcdprotector_Разное.html" вместо "/r_lcdprotector_%D0%E0%E7%ED%EE%E5.html". При условии что этот адрес разбирается mod_rewrite.
Неправда ваша.
.htaccess
Код:
RewriteEngine on RewriteRule .* index.php
.index.php
Код:
<?php
echo $_SERVER['REQUEST_URI'];
?>
Ввожу адрес, как вы сказали, с русскими буквами, на выходе получаю:
Уровень доступа: Вы не можете начинать темы. Вы не можете отвечать на сообщения. Вы не можете редактировать свои сообщения. Вы не можете удалять свои сообщения. Вы не можете добавлять вложения.