Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум Apache

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: при русском ЧПУ выводится 404 ошибка
 
 автор: ladan   (15.02.2012 в 15:55)   письмо автору
 
 

в htaccess есть строка
RewriteRule ^o-нас$ index.php [L,QSA]

Файлы в кодировке utf-8, ссылка нормально отображается русскими буквами, но при переходе эта ссылка превращается в "/%D0%BE-%D0%BD%D0%B0%D1%81?" и выдает 404 ошибку. С латиницей(o-nas) все нормально работает. Не подскажите как можно исправить проблему?

  Ответить  
 
 автор: Sfinks   (15.02.2012 в 17:36)   письмо автору
 
   для: ladan   (15.02.2012 в 15:55)
 

Нужно подставлять шестнадцатиричные коды символов, а не кирилицу. Кирилицы в хтакцесс быть не должно. Т.е. берете ваше "%D0%BE-%D0%BD%D0%B0%D1%81" и заменяете каждый % на \x. Получаете правило:
RewriteRule ^\xD0\xBE-\xD0\xBD\xD0\xB0\xD1\x81$ index.php [L,QSA]

  Ответить  
 
 автор: ladan   (15.02.2012 в 18:23)   письмо автору
 
   для: Sfinks   (15.02.2012 в 17:36)
 

да, действительно все работает :) Спасибо!
Весь сайт в utf-8 переделал, теперь из базы вытаскивается не текст, а одни вопросики в черном квадрате. Если новую инфу вставлять в бд, то нормально показывает русский текст, а старый с вопросиками. почему так??

----


помогло

mysql_query('SET character_set_database = utf8');
mysql_query('SET NAMES utf8');

  Ответить  
 
 автор: ladan   (15.02.2012 в 19:05)   письмо автору
 
   для: ladan   (15.02.2012 в 18:23)
 

а как лучше сделать... сейчас в htaccess такая запись
RewriteRule ^\xD0\xBE-\xD0\xBF\xD1\x80\xD0\xBE\xD0\xB5\xD0\xBA\xD1\x82\xD0\xB5$ index.php?id=2 [L,QSA]

Приходится дополнительно делать проверку mysql_real_escape_string($_GET['id']) от возможных инъекций, но можно и так записывать
RewriteRule ^\xD0\xBE-\xD0\xBF\xD1\x80\xD0\xBE\xD0\xB5\xD0\xBA\xD1\x82\xD0\xB5$ index.php [L,QSA]

И при этом в бд табличку создать, где будут все чпу ссылки и их реальный адресс с параметрами.
И потом просто вырезать эти параметры для mysql запроса из этого реального адреса. И тут получается что вообще не нужно никакой защиты делать. Даже если неправильно будет введена ссылка, то возникнет 404 ошибка.. Хорошая ли это защита от sql атак? :)

  Ответить  
 
 автор: Sfinks   (15.02.2012 в 19:16)   письмо автору
 
   для: ladan   (15.02.2012 в 19:05)
 

Перефразирую ваш вопрос:

- Что лучше проверить, if(!is_numeric($_GET["id"])) exit; Или Создать таблицу, пропарсить REQUEST_URI, подключиться к БД, проверить допустим ли такой адрес и если допустим, выбрать из строки запроса нужный фрагмент, сделать еще один запрос к БД и выбрать параметр который соответствует этому запросу?

Или еще по другому:
- Что лучше, проверить на КПП документы или проверить есть ли в картотеке похожая фотография, если есть, то проверить трезвость, отпечатки пальцев, сетчатку, анализ на вич.... Если ОК, выдать документы и пропустить?

=)

  Ответить  
 
 автор: ladan   (15.02.2012 в 19:47)   письмо автору
 
   для: Sfinks   (15.02.2012 в 19:16)
 

)))) понял

  Ответить  
 
 автор: ladan   (15.02.2012 в 20:14)   письмо автору
 
   для: ladan   (15.02.2012 в 19:47)
 

а вот такая проблемка.

ЧПУ "отдых-в-Анапе/1"

и регулярка в htaccess
RewriteRule ^.+\/?([0-9]+)$ index.php?id=$1 [L,QSA]

не работает...Если слеш убирать(отдых-в-Анапе-1), то нормально работает.. Не подскажите как можно делать ссылки такого типа "категория/параметр/параметр"

и еще вопрос. Как можно разделить такую запись в htaccess
RewriteRule ^.+\/?([0-9]+)$ index.php?id=$1 [L,QSA]

RewriteRule ^(.+)-(.+)$ view_cat.php?zone=$1&category=$2 [L,QSA]

Я так понимаю, нужно разные условия(RewriteCond) перед RewriteRule прописывать, чтоб работало.. А какие условия я хз, с htaccess познакомился на днях :)

  Ответить  
 
 автор: ladan   (15.02.2012 в 21:22)   письмо автору
 
   для: ladan   (15.02.2012 в 20:14)
 

вроде разобрался. Не работало так как регулярка там и там совпадала.
Переделал, пока работает все работает :)

RewriteRule ^.+-?.+-?([0-9]+)$ index.php?id=$1 [L,QSA] #отдых-в-Анапе-1

RewriteRule ^(.+)\+(.+)$ view_cat.php?zone=$1&category=$2 [L,QSA] #Анапа+отели



все еще интересует вопрос

    
а вот такая проблемка.

 ЧПУ "отдых-в-Анапе/1"


Спасибо!!!

  Ответить  
 
 автор: Sfinks   (15.02.2012 в 23:23)   письмо автору
 
   для: ladan   (15.02.2012 в 21:22)
 

вы злоупотребляете конструкциями .+
Так очень скоро комбинации кончатся.
Да и щас уже под ^.+-?.+-?([0-9]+)$ подойдет любой урл из 2ух любых знаков и цифры. Даже http://site.ru///0
Структурируйте как-нибудь какие у вас могут быть ссылки и разделите жоще по каким-нибудь ключевым словам. Нипример не

^(.+)\+(.+)$ view_cat.php?zone=$1&category=$2 [L,QSA] #Анапа+отели
а
отели/([\x7f-\xff]{3,})/ view_cat.php?zone=отели&category=$1

Причем лучше ссылки завершать слешем. ИМХО
___
Да, и в zone=отели, т.е. в строке гет-параметров коды кирилицы возможно нужно писать через %. Пробуйте, проверяйте. Я этого не делал. А так как юзер этого всерн не увидит, лучше так:
отели/([\x7f-\xff]{3,})/ view_cat.php?zone=hotels&category=$1

  Ответить  
 
 автор: ladan   (16.02.2012 в 00:37)   письмо автору
188.2 Кб
 
   для: Sfinks   (15.02.2012 в 23:23)
 

у меня по мимо отелей, еще гостиницы, квартиры и тп куча всего :)
Можно прописать 15 RewriteRule для каждой категории, но не хочу так делать... когда можно 1 раз написать. Выход нашел- в htaccess сначала записывать самые "тяжелые" регулярки, а потом уже ниже к общим спускаться и недоразумений не будет :) А со слешами в ЧПУ у меня проблема((

Вот ЧПУ "письмо-администратору/" со слешем
Регулярка под него
RewriteRule ^\xD0\xBF\xD0\xB8\xD1\x81\xD1\x8C\xD0\xBC\xD0\xBE-\xD0\xB0\xD0\xB4\xD0\xBC\xD0\xB8\xD0\xBD\xD0\xB8\xD1\x81\xD1\x82\xD1\x80\xD0\xB0\xD1\x82\xD0\xBE\xD1\x80\xD1\x83/$ message-to-admin.php [L,QSA]
Без слешов все работает.

Так и не понимаю почему так происходит... от слешов весь каркас сайта рушится, будто таблица стилей отключается. Скрин приложил, может у вас тоже так было..

  Ответить  
 
 автор: Sfinks   (16.02.2012 в 03:07)   письмо автору
 
   для: ladan   (16.02.2012 в 00:37)
 

> Выход нашел- в htaccess сначала записывать самые "тяжелые" регулярки,
> а потом уже ниже к общим спускаться и недоразумений не будет
Еще как будут! MR работает так (простейший случай без RewriteCond): берется запрошенный урл, подставляется в 1ое правило, если подошло, заменяется на то, что указано в правиле, затем берется то что получилось и подставляется во второе правило, если совпало - заменяет и т.д. и т.п. до самого последнего правила. При чем указатель [L], который должен прерывать эту цепочку, нифига не срабатывает. Вроде как должен, ан нет. А поэтому очень велика вероятность того, что вы напишите такое общее правило, под которое потом все что угодно подойдет.

> от слешов весь каркас сайта рушится
А у вас как ссылка на CSS в HTML указана? если просто <link rel="stylesheet" href="style.css" type="text/css" />, то это естественно. Браузер же начинает думать что он в папке "письмо-администратору" и в ней же и ищет файл. нужно указывать либо абсолютный путь через http:// либо хотя б от корня: <link rel="stylesheet" href="/style.css" type="text/css" />. Тоже самое касайтся и картинок и прочих встроенных элементов. Либо можно еще указать в шапке страницы тег <base>

> гостиницы, квартиры и тп куча всего
Можно не писать на каждый похожий вариант по правилу, а объеденить:
RewriteRule ^(type1|type2|type3)/(что-то еще)/ redir.php?cat=$1&dir=$2
В общем-то дело ваше. Мое дело посоветовать не наступать на мои грабли. Хотите сами на свои наступить - дело ваше. Просто помните что отладчиков для MR не существует, а лог такой, что без него лучше.

  Ответить  
 
 автор: ladan   (16.02.2012 в 10:06)   письмо автору
 
   для: Sfinks   (16.02.2012 в 03:07)
 

Спасибо, попробую таблицу стилей через абсолютный путь подключить и этот вариант RewriteRule ^(type1|type2|type3)/(что-то еще)/ redir.php?cat=$1&dir=$2 понравился. Буду тогда им пользоваться :)

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования