Показать полную графическую версию : Регулярное выражение. Не работает а-яА-Я
Artem-Samsung
19-10-2010, 23:54
похоже, у меня на хостинге не работает такое правило, как а-яА-Яa-zA-Z
Нужно сделать запись в .htaccess
Подскажите, как обратиться в хостинг с вопросом.
Какой модуль или библиотека должна стоять у них на сервере для правильного отображения кириллических букв в регулярных выражениях?
Хостинг - Линукс
вообщем вот такое выражение не фурычит:
RewriteRule ^([а-яА-Яa-zA-Z0-9\_\-]+)\/([0-9]+)\/[\+а-яА-Яa-zA-Z0-9\_\-\(\)\:\.\-]+\.htm$ index.php?production=$1&id=$2 [L]
хотя может проблема быть в какой то кодировке
Мне вот отвечает такими символами странными
The requested URL /инÑÑ‚Ñ?укциÑ/ÐбÑ?а-КадабÑ?а/10/ТеÑÑ‚.pdf was not found on this server.
/инÑ�Ñ‚Ñ?укциÑ�/Ð�бÑ?а-КадабÑ?а/10/ТеÑ�Ñ‚.pdf »
это htmlentities (http://docs.php.net/manual/ru/function.htmlentities.php) (съедено страницей), урлы нужно в (raw)urlencode кодировать. Кодировка файла хтаксес должна соответствовать кодировке урла (utf8) или локали (в которой работает сервер). Иначе используйте другое написание символов кириллицы (16-ричное)...
Artem-Samsung
20-10-2010, 02:25
RewriteRule ^(инструкция)\/(DJ\_микшер)\/([0-9]+)\/[\+а-яА-Яa-zA-Z0-9\_\-\(\)\:\.\-]+\.pdf$ pdftest.php?pdf=$3 [L]
RewriteRule ^(инструкция)\/(CD\_проигрыватель)\/([0-9]+)\/[\+а-яА-Яa-zA-Z0-9\_\-\(\)\:\.\-]+\.pdf$ pdftest.php?pdf=$3 [L]
RewriteRule ^(инструкция)\/(Вертушка)\/([0-9]+)\/[\+а-яА-Яa-zA-Z0-9\_\-\(\)\:\.\-]+\.pdf$ pdftest.php?pdf=$3 [L]
RewriteRule ^(инструкция)\/(Студийные_мониторы)\/([0-9]+)\/[\+а-яА-Яa-zA-Z0-9\_\-\(\)\:\.\-]+\.pdf$ pdftest.php?pdf=$3 [L]
RewriteRule ^(инструкция)\/(Наушники)\/([0-9]+)\/[\+а-яА-Яa-zA-Z0-9\_\-\(\)\:\.\-]+\.pdf$ pdftest.php?pdf=$3 [L]
RewriteRule ^(инструкция)\/(Микрофон)\/([0-9]+)\/[\+а-яА-Яa-zA-Z0-9\_\-\(\)\:\.\-]+\.pdf$ pdftest.php?pdf=$3 [L]
RewriteRule ^(инструкция)\/(Midi\-клавиатура)\/([0-9]+)\/[\+а-яА-Яa-zA-Z0-9\_\-\(\)\:\.\-]+\.pdf$ pdftest.php?pdf=$3 [L]
забавно, что так - работает, но так не в кайф =)
RewriteRule ^([^\/]+)\/([0-9]+)\/[^\/]+\.htm$ index.php?production=$1&id=$2 [L]
Artem-Samsung
20-10-2010, 02:37
Sham, ага : )))
Artem-Samsung
07-11-2010, 02:12
Почему то не подхватывает кириллицу на хостинге, который даже кириллические домены поддерживает. Наверное я что то делаю не так
Нужно вот так:
RewriteRule ^([a-zA-Zа-яА-Я0-9-]*)/([0-9]+)\-([a-zA-Zа-яА-Я0-9-]*)\.html(.*)$ /product.php?id_product=$2$4 [L,E]
но вот выше, там в первой части не работает а-яА-Я, т.е. кириллическая ссылка не читается
Вторая часть - нормально подхватывает
Делаю так, и работает:
RewriteRule ^(.*)/([0-9]+)\-([a-zA-Zа-яА-Я0-9-]*)\.html(.*)$ /product.php?id_product=$2$4 [L,E]
но хотелось бы, как в первом варианте.
кодировка htaccess должна соответствовать кодировке кириллицы из заголовка запроса (имхо только в юникоде utf8). Отследите запрос в разных браузерах, как там кириллица передается. Если urlencoded, то имхо в регекспе надо учитывать и такой вариант. Тем более, в браузерах есть настройка "кодировать урл".
Файл htaccess дб в кодировке utf8 (кодировка URL) или в регекспах учесть urlencoded символы ("символ" - %F1%E8%EC%E2%EE%EB), т.е. добавить знак процента "%" в скобки.
Если сайт не в кодировке UTF, то браузеры имхо по любому кодируют неюникод-символы в урлах.
Artem-Samsung
07-11-2010, 17:03
Отследите запрос в разных браузерах, как там кириллица передается. »
Можно поподробней?
знак процента "%" в скобки »
Здесь тоже поподробней с примером пожалуйста
Так типа?
RewriteRule ^([a-zA-Zа-яА-Я0-9%-]*)/([0-9]+)\-([a-zA-Zа-яА-Я0-9-]*)\.html(.*)$ /product.php?id_product=$2$4 [L,E]
таки да, если копипастить, то получается такая ссылка:
%D0%B2%D1%8B%D0%B1%D1%80%D0%B0%D1%82%D1%8C-%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D1%83%D1%8E-%D0%B3%D0%B8%D1%82%D0%B0%D1%80%D1%83/23-classic-guitar-classic-guitar-tenson-classic-guitar-tenson-f500-090-buy-classic-guitar-tenson-f500-090-kiev.html
пример (любой плагин к ff)
GET /post-1536966.html HTTP/1.1
Host: forum.oszone.net
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.2.12) Gecko/20101026 Firefox/3.6.12
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Cache-Control: max-age=0
смотрим путь из первой строки.
^([a-zA-Zа-яА-Я0-9\%\-]*)
с кириллицей вообще сложный вопрос, имхо только UTF-8. (еще зависит от серверной ОС, и как она поддерживает кириллицу, если имена файлов в ней).
Artem-Samsung
12-11-2010, 00:39
По дэфолту было:
RewriteRule ^([a-zA-Z0-9-]*)/([0-9]+)\-([a-zA-Z0-9-]*)\.html(.*)$ /product.php?id_product=$2$4 [L,E]
Ссылки переписал кириллические, с браузера копируются так:
/%D0%B2%D1%8B%D0%B1%D1%80%D0%B0%D1%82%D1%8C-%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D1%83%D1%8E-%D0%B3%D0%B8%D1%82%D0%B0%D1%80%D1%83/23-classic-guitar-classic-guitar-tenson-classic-guitar-tenson-f500-090-buy-classic-guitar-tenson-f500-090-kiev.html
Следовательно правило написал так:
RewriteRule ^([a-zA-Zа-яА-Я0-9\%\-]+)/([0-9]+)\-([a-zA-Zа-яА-Я0-9-]*)\.html(.*)$ /product.php?id_product=$2$4 [L,E]
Но не работает :(
На счет хедеров, то вот:
http://dommuzyki.com.ua/%D0%B2%D1%8B%D0%B1%D1%80%D0%B0%D1%82%D1%8C-%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D1%83%D1%8E-%D0%B3%D0%B8%D1%82%D0%B0%D1%80%D1%83/23-classic-guitar-classic-guitar-tenson-classic-guitar-tenson-f500-090-buy-classic-guitar-tenson-f500-090-kiev.html
GET /%D0%B2%D1%8B%D0%B1%D1%80%D0%B0%D1%82%D1%8C-%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D1%83%D1%8E-%D0%B3%D0%B8%D1%82%D0%B0%D1%80%D1%83/23-classic-guitar-classic-guitar-tenson-classic-guitar-tenson-f500-090-buy-classic-guitar-tenson-f500-090-kiev.html HTTP/1.1
Host: dommuzyki.com.ua
User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.12) Gecko/20101027 Ubuntu/10.10 (maverick) Firefox/3.6.12
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Referer: http://dommuzyki.com.ua/8-%D0%B2%D1%8B%D0%B1%D1%80%D0%B0%D1%82%D1%8C-%D0%B3%D0%B8%D1%82%D0%B0%D1%80%D1%83
Cookie: низя :)
Cache-Control: max-age=0
HTTP/1.1 404 Not Found
Date: Thu, 11 Nov 2010 21:33:05 GMT
Server: Apache
X-Powered-By: PHP/5.2.13
P3P: CP="IDC DSP COR CURa ADMa OUR IND PHY ONL COM STA"
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Keep-Alive: timeout=5, max=20
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: text/html; charset=utf-8
Работает так:
RewriteRule ^(.*)/([0-9]+)\-([a-zA-Zа-яА-Я0-9-]*)\.html(.*)$ /product.php?id_product=$2$4 [L,E]
Но неинтересно
где лежит конфиг, и в какой кодировке сохранен?
Artem-Samsung
12-11-2010, 01:07
где лежит конфиг, и в какой кодировке сохранен? »
если .htaccess имеется ввиду, то utf-8
С передним слешем непонятно (какой путь получает правило, если с передним слешем, то добавьте \/? вначале). Сложно, не видя всего. Так вроде без ошибок.
Artem-Samsung
12-11-2010, 01:36
В корне:
/
enca -L ru .htaccess
Universal transformation format 8 bits; UTF-8
Doubly-encoded to UTF-8 from ISO-8859-5
Если конфиги движка:
/config
enca -L ru *
config.inc.php: 7bit ASCII characters
index.php: 7bit ASCII characters
settings.inc.php: 7bit ASCII characters
smarty.config.inc.php: 7bit ASCII characters
так не стало лучше:
RewriteRule ^\/?([a-zA-Zа-яА-Я0-9\%\-]+)/([0-9]+)\-(.*)\.html(.*)$ /product.php?id_product=$2$4 [L,E]
а зачем флаг E? он для переменной...
Artem-Samsung
12-11-2010, 01:45
а зачем флаг E? он для переменной... »
по дефолту стоял, я и оставил
движок: prestashop
имхо сервер неправильно декодирует путь и правило получает уже неверную кодировку. Попробуйте вывести, что получает правило (echo $_SERVER['QUERY_STRING'] //upd: или $_GET['all'] тогда) c правилом
upd: без условия может зациклить
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ /product.php?all=$1 [L]
и смотрите кодировку этих символов
так имхо надежнее
RewriteRule ^\/?[^\/]+/([0-9]+)\-.*\.html$ /product.php?id_product=$1 [L]
apache 2.2, htaccess в utf8: если в правиле напрямую кириллицу указывать, то работает, если в 16-ричном (типа \xC1) - то нет. Но при выводе пути (в браузер) кириллица все-равно преобразована неправильно.
Т.е. с кириллицей в пути URLa лучше не связываться, т.к. непонятно, как декодируются из экранированного пути. При этом get-параметры декодируются веб-сервером правильно, как ни странно.
Можно предположить, что экранированный путь декодируется в системную кодировку сервера (в кодировку файловой системы), из-за этого неувязочка.
Artem-Samsung
12-11-2010, 10:47
Т.е. с кириллицей в пути URLa лучше не связываться, т.к. непонятно, как декодируются из экранированного пути. При этом get-параметры декодируются веб-сервером правильно, как ни странно. »
а иногда очень нужно.
я вот, если сам какой то движок мини делаю, то с кириллицей поступаю так.
В .htaccess пишу:
AddDefaultCharset UTF-8
DirectoryIndex index.php
Options +FollowSymlinks
RewriteEngine On
RewriteRule .* index.php
в index.php
$request_url = mb_convert_encoding(substr(urldecode($_SERVER['REQUEST_URI']), 1), 'utf-8', 'auto');
$de_link = explode("/", $request_url);
if ($request_url=="index.php" || $request_url == "" || $de_link[0] == "Главная") {
include('');
} else if (ereg("^p[0-9]*$", $de_link[0])) {
include('');
}
} else if ($de_link[0] == "Опрос" && count($de_link) == 2) {
include('');
else {
include('modules/content/main.php');
}
ну и т.п.
прокомментриуйте пожалуйста способ))
еслиmb_convert_encoding » работает как нужно (на выходе кириллица), и index.php в utf8, то пойдет.
include(''); »
непонятно.
в правиле можно направлять на этот скрипт только урлы, содержащие нелатиницу [^\w] или [^a-zA-Z0-9\/\-\_\.] - и в таком духе (набор символов определяется на практике).
не спамь в полезняшки
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.