mod_rewrite @ DeForum.ru
DeДверь  
Логин:  
Пароль:  
  Автологин  
   
Разместить рекламу
Письмо админу
Правила | FAQ | *Поиск | Наша команда | Регистрация | Вход
 
 
На страницу 1 2  >  Страница 1 из 2 [ Сообщений: 36 ] 
*   Список форумов / Начинка и техника / Программирование для WWW » ответить » создать топик « | »
Автор Сообщение
s_popov72
новый человек
6
Сообщения: 14
Зарегистрирован: 15.12.06
Заголовок сообщения: mod_rewrite
Сообщение Добавлено: 7 Сентябрь 2007, 12:22:23 
Переделал все ссылки в файлах под ЧПУ
но теперь работаю и ссылки вида: news/02-01-2007/
и ссылки news.php?dt=02012007

как сделать что-бы последние неработали?

может есть какоето правило что-бы допустим написать его в конце htaccess
которое бы проверяло если все предыдущие несработали, то направлять на главную страницу?
Crazy Муж.
Модератор
107
Сообщения: 14561
Зарегистрирован: 23.12.01
Откуда: Moscow
Сообщение Добавлено: 7 Сентябрь 2007, 12:56:03 
В чем цель этого забавного эксперимента?
s_popov72
новый человек
6
Сообщения: 14
Зарегистрирован: 15.12.06
Заголовок сообщения: Это не эксперимент
Сообщение Добавлено: 8 Сентябрь 2007, 12:00:18 
суть в том чо старые ссылки работают
вместе с новыми

надо что-бы старые ссылки перестали работать
без изменения кода - я думал это можно сделать при помощи mod_rewrite
Jamakaser Муж.
участник
91
Сообщения: 1163
Зарегистрирован: 26.01.05
Сообщение Добавлено: 8 Сентябрь 2007, 12:43:39 
s_popov72,

Вы не поняли вопроса который задал Crazy. Я переведу: Зачем Вам это нужно?

_________________
Найди кликабельный пиксель -->
Crazy Муж.
Модератор
107
Сообщения: 14561
Зарегистрирован: 23.12.01
Откуда: Moscow
Сообщение Добавлено: 8 Сентябрь 2007, 14:47:35 

s_popov72 писал(а):
надо что-бы старые ссылки перестали работать



Легко. Переименуй news.php в news2.php и поправь соответственно правило. Озвученную тобой проблему это решает.

Или ты на самом деле чего-то другого хотел?
Kurilshik
Goldmember
142
Сообщения: 12797
Зарегистрирован: 18.10.04
Откуда: Кожаное кресло
Сообщение Добавлено: 8 Сентябрь 2007, 18:06:57 
Crazy, он хочет через модреврайт запретить не чпу-шный вид ссылок. так нельзя, так как htacces не может запретить сам себя по идее :)

_________________

Портфолио - ЖЖ - Кулинарные рецепты - Блог о дизайне, уроки фотошоп

icq: 295346452 | Почта: info()alexey-popov.com

.
Kurilshik
Goldmember
142
Сообщения: 12797
Зарегистрирован: 18.10.04
Откуда: Кожаное кресло
Сообщение Добавлено: 8 Сентябрь 2007, 18:08:14 
по идее, нужно переименовать файл, как уже говорили, а в старом делать переадресацию на новый вид url. но не понятен смысл этого. Страницы всеравно в скором времени переиндексируются

_________________

Портфолио - ЖЖ - Кулинарные рецепты - Блог о дизайне, уроки фотошоп

icq: 295346452 | Почта: info()alexey-popov.com

.
Paul Yanchenko Муж.
новый человек
1
Сообщения: 112
Зарегистрирован: 05.02.04
Откуда: Екатеринбург
Сообщение Добавлено: 13 Сентябрь 2007, 00:20:22 
Лично я решил эту проблему иначе. Я не использую кучу правил реврайта на каждый раздел сайта, а использую по сути одно глобальное правило, которое реврайтит любой запрос в глубине корня моего сайта на index.php. А там уже происходит разбор урла ($_SERVER['REQUEST_URI']) и определение какой класс вызывать для обработки запроса, а также обработка ошибок типа 404, 403, 400 и др. При этом .htaccess упрощенно выглядит следующим образом:

Код:
RewriteEngine on
RewriteCond %{REQUEST_URI} !^/favicon\.ico$
RewriteCond %{REQUEST_URI} !^/robots\.txt$
RewriteRule .* index.php


В специальных директориях, в которых лежит статический контент типа /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 Муж.
новый человек
1
Сообщения: 112
Зарегистрирован: 05.02.04
Откуда: Екатеринбург
Сообщение Добавлено: 18 Сентябрь 2007, 11:57:22 
Что никаких комментариев не будет?
Crazy Муж.
Модератор
107
Сообщения: 14561
Зарегистрирован: 23.12.01
Откуда: Moscow
Сообщение Добавлено: 18 Сентябрь 2007, 12:05:13 
Paul Yanchenko, а ты никаких вопросов не задавал.
Paul Yanchenko Муж.
новый человек
1
Сообщения: 112
Зарегистрирован: 05.02.04
Откуда: Екатеринбург
Сообщение Добавлено: 18 Сентябрь 2007, 13:36:36 
Не задавал, но почему-то ожидал возникновение какой-то дискуссии. Неужели я все так правильно написал, что ни у кого не нашлось ничего ни возразить, ни добавить?
gro
новый человек
17
Сообщения: 43
Зарегистрирован: 09.09.06
Сообщение Добавлено: 18 Сентябрь 2007, 19:32:54 
Paul Yanchenko, правильно, то оно всё правильно, но человек изначально сказал:

Цитата:
Переделал все ссылки в файлах под ЧПУ


Т.е. у него был какой-то уже готовый сайт, а теперь он его доработал.
Так же часто происходит с доработкой различных форумов и CMS (phpBB и т.п.), где уже саму структуру системы не изменить, приходится только напильничком внешность подрабатывать.

Кстати, можно не отменять в каждом статичном каталоге предыдущий хтаксес, а вынести это в корневой, например:
Код:
RewriteCond %{REQUEST_URI} ^/(i|css|js)/.*
RewriteRule . - [L]


Что касается изначального вопроса, то если очень нужно, можно смотреть REQUEST_URI. Если там не чепеушный вид — посылать пользователя, либо переадресовывать на чпу-вариант.
Crazy Муж.
Модератор
107
Сообщения: 14561
Зарегистрирован: 23.12.01
Откуда: Moscow
Сообщение Добавлено: 18 Сентябрь 2007, 22:37:13 

Paul Yanchenko писал(а):
Не задавал, но почему-то ожидал возникновение какой-то дискуссии. Неужели я все так правильно написал, что ни у кого не нашлось ничего ни возразить, ни добавить?



Ты написал: "лично мне мой подход нравится". Я тебе верю. Поскольку твой подход вызывает лично у меня нулевой интерес, а никаких конкретных вопросов ты не задавал -- никаких комментариев я не пишу. :) Логично?
Paul Yanchenko Муж.
новый человек
1
Сообщения: 112
Зарегистрирован: 05.02.04
Откуда: Екатеринбург
Сообщение Добавлено: 19 Сентябрь 2007, 07:36:37 
Логично, как логично и то, что ты не единственный человек на этом форуме, следовательно комментарии могут исходить от кого-то кроме тебя. :-D
Paul Yanchenko Муж.
новый человек
1
Сообщения: 112
Зарегистрирован: 05.02.04
Откуда: Екатеринбург
Сообщение Добавлено: 19 Сентябрь 2007, 07:39:02 
Кстати, у меня родился вопрос по поводу mod_rewrite. Как создать правило реврайтинга, которое реврайтит URL, содержащий символ '%'? Как его правильно заэкранировать? Перепробовал все известные мне способы экранизации, перечитал доку, провел несколько экспериментов -- никак.
Crazy Муж.
Модератор
107
Сообщения: 14561
Зарегистрирован: 23.12.01
Откуда: Moscow
Сообщение Добавлено: 19 Сентябрь 2007, 09:10:37 

Paul Yanchenko писал(а):
Логично, как логично и то, что ты не единственный человек на этом форуме, следовательно комментарии могут исходить от кого-то кроме тебя. :-D



Из наблюдаемого количества комментариев можно сделать вывод, что многие разделяют мою точку зрения.
prometheus Муж.
соучастник
20
Сообщения: 380
Зарегистрирован: 02.01.07
Откуда: у Майкла Дугласа базука?
Сообщение Добавлено: 19 Сентябрь 2007, 12:01:03 
Внесу изюма в диалог :)

Программировать нужно так, чтобы потом ничего не реврайтить

А то получается, скриптовая часть обрабатывает запросы "так",
а потом между сервером и клиентом идет еще дополнительная обработка по трансформации запросов...

Получается дополнительная нагрузка на CPU и память. А это уже не хорошо.

_________________
Прометей.
Crazy Муж.
Модератор
107
Сообщения: 14561
Зарегистрирован: 23.12.01
Откуда: Moscow
Сообщение Добавлено: 19 Сентябрь 2007, 12:41:27 

prometheus писал(а):
Программировать нужно так, чтобы потом ничего не реврайтить



Я бы выразился несколько менее категорично: следует стараться выдерживать соответствие между структурой приложения и структурой URL -- это впоследствии облегчает отладку и сопровождение.
Paul Yanchenko Муж.
новый человек
1
Сообщения: 112
Зарегистрирован: 05.02.04
Откуда: Екатеринбург
Сообщение Добавлено: 21 Сентябрь 2007, 12:40:17 
Кстати, а на мой вопрос никто не может/не хочет ответить?

> Кстати, у меня родился вопрос по поводу mod_rewrite. Как создать правило реврайтинга, которое реврайтит URL,
> содержащий символ '%'? Как его правильно заэкранировать? Перепробовал все известные мне способы экранизации,
> перечитал доку, провел несколько экспериментов -- никак.
gro
новый человек
17
Сообщения: 43
Зарегистрирован: 09.09.06
Сообщение Добавлено: 21 Сентябрь 2007, 19:55:53 

Цитата:
Кстати, у меня родился вопрос по поводу mod_rewrite. Как создать правило реврайтинга, которое реврайтит URL, содержащий символ '%'? Как его правильно заэкранировать? Перепробовал все известные мне способы экранизации, перечитал доку, провел несколько экспериментов -- никак.


Пример, что ли, покажите.
Если вы имеете ввиду "%" в url-кодированных параметрах, то к моменту обработки mod_rewriteом, они уже перекодированы обратно, т.е. вместо %xx, там уже стоит соответствующий символ.
Paul Yanchenko Муж.
новый человек
1
Сообщения: 112
Зарегистрирован: 05.02.04
Откуда: Екатеринбург
Сообщение Добавлено: 22 Сентябрь 2007, 20:41:06 
Хм. Действительно. Похоже, что так. Хотя весьма странно почему это mod_rewrite делает urldecode(), его ведь об этом никто не просил...
Paul Yanchenko Муж.
новый человек
1
Сообщения: 112
Зарегистрирован: 05.02.04
Откуда: Екатеринбург
Сообщение Добавлено: 22 Сентябрь 2007, 20:50:17 
Я просто хотел сделать что-то вроде поддержки русских названий страниц. Чтобы при вводе в адресной строке 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" упорно не хочет матчиться моим реврайтрулом.
gro
новый человек
17
Сообщения: 43
Зарегистрирован: 09.09.06
Сообщение Добавлено: 22 Сентябрь 2007, 21:50:26 

Цитата:
весьма странно почему это mod_rewrite делает urldecode(), его ведь об этом никто не просил...


А чего его просить? Ему нужно по папкам сервера идти в соответствии с урлом, явно ему нужны уже раскодированные названия.

Вобще-то, предлагаю еще раз десять подумать, прежде чем делать нелатинские пути. Так уж они нужны?
Хотя вот в википедии они нужны. Сейчас проверил на ней IE6, FF2, Opera9, все трое кодируют одинаково в UTF.


Цитата:
путь "/%D1%80%D0%B5%D0%B7%D1%8E%D0%BC%D0%B5" упорно не хочет матчиться моим реврайтрулом.


Сам то htaccess в UTF?

И вообще вы только что рассказывали про "один обработчик всех запросов", почему здесь его не используете?
Crazy Муж.
Модератор
107
Сообщения: 14561
Зарегистрирован: 23.12.01
Откуда: Moscow
Сообщение Добавлено: 22 Сентябрь 2007, 23:53:31 

Paul Yanchenko писал(а):
Хотя весьма странно почему это mod_rewrite делает urldecode(), его ведь об этом никто не просил...



mod_rewrite не делает "urldecode()". Это обязанность ядра сервера. Немедленно по получении запроса.
Paul Yanchenko Муж.
новый человек
1
Сообщения: 112
Зарегистрирован: 05.02.04
Откуда: Екатеринбург
Сообщение Добавлено: 23 Сентябрь 2007, 12:41:26 

gro писал(а):
Вобще-то, предлагаю еще раз десять подумать, прежде чем делать нелатинские пути. Так уж они нужны?


Разумеется не нужны. Это просто фича/удобство/понт. С русских URL'ов происходит редирект на латинские.


gro писал(а):
Хотя вот в википедии они нужны. Сейчас проверил на ней IE6, FF2, Opera9, все трое кодируют одинаково в UTF.


Википедия просто сама редиектит твой FF с URL в CP1251 на UTF8. Смотри сам -- ввели адрес "http://ru.wikipedia.org/wiki/Баг":

Код:
http://ru.wikipedia.org/wiki/%C1%E0%E3

GET /wiki/%C1%E0%E3 HTTP/1.1
Host: ru.wikipedia.org
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.7) Gecko/20070914 Firefox/2.0.0.7
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language: ru,en-us;q=0.7,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
X-lori-time-1: 1190539755899
If-Modified-Since: Sun, 23 Sep 2007 09:26:36 GMT

HTTP/1.x 301 Moved Permanently
Date: Sun, 23 Sep 2007 09:26:36 GMT
Server: Apache
X-Powered-By: PHP/5.1.2
Vary: Accept-Encoding,Cookie
Cache-Control: private, s-maxage=0, max-age=0, must-revalidate
Last-Modified: Sun, 23 Sep 2007 09:26:36 GMT
Location: http://ru.wikipedia.org/wiki/%D0%91%D0%B0%D0%B3
Content-Encoding: gzip
Content-Length: 20
Content-Type: text/html; charset=utf-8



gro писал(а):

Цитата:
путь "/%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?
Crazy Муж.
Модератор
107
Сообщения: 14561
Зарегистрирован: 23.12.01
Откуда: Moscow
Сообщение Добавлено: 23 Сентябрь 2007, 12:48:53 

Paul Yanchenko писал(а):
А каким образом тогда PHP получает в $_SERVER['REQUEST_URI'] не декодированный URL?



Я где-то написал, что сервер первым делом уничтожает все упоминания об исходной строке? Перечитай цитату еще раз. Внимательно:


Цитата:
mod_rewrite не делает "urldecode()". Это обязанность ядра сервера. Немедленно по получении запроса.

#lex#
новый человек
0
Сообщения: 4
Зарегистрирован: 24.09.07
Сообщение Добавлено: 24 Сентябрь 2007, 23:33:47 

Цитата:
Пример, что ли, покажите.
Если вы имеете ввиду "%" в url-кодированных параметрах, то к моменту обработки mod_rewriteом, они уже перекодированы обратно, т.е. вместо %xx, там уже стоит соответствующий символ.


Может подскажете. Очень надо, как-то получить, точно то, что ввёл пользователь в строке браузера.
Код:
http://сайт.ru/r_lcdprotector_%D0%E0%E7%ED%EE%E5.html

мне надо на PHP получить
Код:
/r_lcdprotector_%D0%E0%E7%ED%EE%E5.html

а не
Код:
http://сайт.ru/r_lcdprotector_Разное.html

Как это сделать?
Crazy Муж.
Модератор
107
Сообщения: 14561
Зарегистрирован: 23.12.01
Откуда: Moscow
Сообщение Добавлено: 24 Сентябрь 2007, 23:40:25 

#lex# писал(а):
Пример, что ли, покажите.



Ты не в состоянии прочесть пример, который написан двумя сообщениями выше? Тебе вслух прочитать?
#lex#
новый человек
0
Сообщения: 4
Зарегистрирован: 24.09.07
Сообщение Добавлено: 25 Сентябрь 2007, 10:23:10 

Цитата:
Ты не в состоянии прочесть пример, который написан двумя сообщениями выше? Тебе вслух прочитать?


Похоже не в состоянии.
Прочитай мне, как на PHP получить точно то, что ввёл пользователь в строке браузера.

мне надо на PHP получить
Код:
Код:
/r_lcdprotector_%D0%E0%E7%ED%EE%E5.html


а не
Код:
Код:
/r_lcdprotector_Разное.html


Как это сделать?
Crazy Муж.
Модератор
107
Сообщения: 14561
Зарегистрирован: 23.12.01
Откуда: Moscow
Сообщение Добавлено: 25 Сентябрь 2007, 13:18:25 

Цитата:
А каким образом тогда PHP получает в $_SERVER['REQUEST_URI'] не декодированный URL?

#lex#
новый человек
0
Сообщения: 4
Зарегистрирован: 24.09.07
Сообщение Добавлено: 25 Сентябрь 2007, 16:59:10 
Попытка номер 3

Фишка в том, что $_SERVER['REQUEST_URI'] возращает "/r_lcdprotector_Разное.html" вместо "/r_lcdprotector_%D0%E0%E7%ED%EE%E5.html". При условии что этот адрес разбирается mod_rewrite.
Crazy Муж.
Модератор
107
Сообщения: 14561
Зарегистрирован: 23.12.01
Откуда: Moscow
Сообщение Добавлено: 25 Сентябрь 2007, 22:36:21 

#lex# писал(а):
При условии что этот адрес разбирается mod_rewrite.



Могу тебе только посочувствовать. Ответ, полагаю, очевиден. На выбор:

1. Перестань этого хотеть. (Прежде всего -- потому, что это бессмысленное желание)
2. Не используй mod_rewrite
Crazy Муж.
Модератор
107
Сообщения: 14561
Зарегистрирован: 23.12.01
Откуда: Moscow
Сообщение Добавлено: 25 Сентябрь 2007, 22:45:52 
Кстати, для экономии времени и отвечая на неизбежный вопрос "а как мне НЕ использовать mod_rewrite" -- даю подсказку: использовать AddHandler+Action


.htaccess писал(а):
Action render-foobar /foobar.php
AddHandler render-foobar .foobar

#lex#
новый человек
0
Сообщения: 4
Зарегистрирован: 24.09.07
Сообщение Добавлено: 25 Сентябрь 2007, 23:23:16 
Наверно надо будет попробывать, что-то типа этого...

http://www.egoroff.spb.ru/portfolio/apa … write.html

'noescape|NE' (не экранировать URI при выводе)
Этот флаг не даёт mod_rewrite применять обычные правила экранирования URI к результату преобразования. Обычно, специальные символы (такие как '%', '$', ';', и так далее) будут экранированы их шестнадцатиричными подстановками ('%25', '%24', и '%3B', соответственно); этот флаг не дает это делать. Это позволяет символам процента появлятся на выходе , как в
Код:
RewriteRule /foo/(.*) /bar?arg=P1\%3d$1
[R,NE]

для которого '/foo/zed' преобразовывалось бы в безопасный запрос '/bar?arg=P1=zed'.
Paul Yanchenko Муж.
новый человек
1
Сообщения: 112
Зарегистрирован: 05.02.04
Откуда: Екатеринбург
Сообщение Добавлено: 26 Сентябрь 2007, 09:24:06 

#lex# писал(а):
Попытка номер 3

Фишка в том, что $_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'];

?>


Ввожу адрес, как вы сказали, с русскими буквами, на выходе получаю:

Код:
http://localhost/r_lcdprotector_%D0%E0%E7%ED%EE%E5.html


И без всяких 'noescape'…
*   Список форумов / Начинка и техника / Программирование для WWW « | » » ответить » создать топик
На страницу 1 2  >  Страница 1 из 2 [ Сообщений: 36 ] 
Показать сообщения за:   Поле сортировки  
Найти:
Перейти:  
Уровень доступа: Вы не можете начинать темы. Вы не можете отвечать на сообщения. Вы не можете редактировать свои сообщения. Вы не можете удалять свои сообщения. Вы не можете добавлять вложения.
cron


ООО ДеФорум
При использовании материалов сайта ссылка на DeForum.ru — обязательна.
Проект Павла Батурина ©2001-2077; // Powered by phpBB © 2013 phpBB Group
Rambler's Top100