Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Вебмастеру (http://forum.oszone.net/forumdisplay.php?f=22)
-   -   Регулярное выражение. Не работает а-яА-Я (http://forum.oszone.net/showthread.php?t=188810)

Artem-Samsung 19-10-2010 23:54 1522695

Регулярное выражение. Не работает а-яА-Я
 
похоже, у меня на хостинге не работает такое правило, как а-яА-Я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.

Sham 20-10-2010 02:22 1522750

Цитата:

Цитата Artem-Samsung
/инÑ�Ñ‚Ñ?укциÑ�/Ð�бÑ?а-КадабÑ?а/10/ТеÑ�Ñ‚.pdf »

это htmlentities (съедено страницей), урлы нужно в (raw)urlencode кодировать. Кодировка файла хтаксес должна соответствовать кодировке урла (utf8) или локали (в которой работает сервер). Иначе используйте другое написание символов кириллицы (16-ричное)...

Artem-Samsung 20-10-2010 02:25 1522752

Код:

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]

забавно, что так - работает, но так не в кайф =)

Sham 20-10-2010 02:36 1522755

Код:

RewriteRule ^([^\/]+)\/([0-9]+)\/[^\/]+\.htm$ index.php?production=$1&id=$2 [L]

Artem-Samsung 20-10-2010 02:37 1522756

Sham, ага : )))

Artem-Samsung 07-11-2010 02:12 1536604

Почему то не подхватывает кириллицу на хостинге, который даже кириллические домены поддерживает. Наверное я что то делаю не так

Нужно вот так:
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]
но хотелось бы, как в первом варианте.

Sham 07-11-2010 16:40 1536945

кодировка htaccess должна соответствовать кодировке кириллицы из заголовка запроса (имхо только в юникоде utf8). Отследите запрос в разных браузерах, как там кириллица передается. Если urlencoded, то имхо в регекспе надо учитывать и такой вариант. Тем более, в браузерах есть настройка "кодировать урл".
Файл htaccess дб в кодировке utf8 (кодировка URL) или в регекспах учесть urlencoded символы ("символ" - %F1%E8%EC%E2%EE%EB), т.е. добавить знак процента "%" в скобки.
Если сайт не в кодировке UTF, то браузеры имхо по любому кодируют неюникод-символы в урлах.

Artem-Samsung 07-11-2010 17:03 1536966

Цитата:

Цитата Sham
Отследите запрос в разных браузерах, как там кириллица передается. »

Можно поподробней?
Цитата:

Цитата Sham
знак процента "%" в скобки »

Здесь тоже поподробней с примером пожалуйста
Так типа?
Код:

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

Sham 07-11-2010 17:46 1537001

пример (любой плагин к 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 1540546

По дэфолту было:
Код:

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]

Но неинтересно

Sham 12-11-2010 00:55 1540562

где лежит конфиг, и в какой кодировке сохранен?

Artem-Samsung 12-11-2010 01:07 1540576

Цитата:

Цитата Sham
где лежит конфиг, и в какой кодировке сохранен? »

если .htaccess имеется ввиду, то utf-8

Sham 12-11-2010 01:28 1540594

С передним слешем непонятно (какой путь получает правило, если с передним слешем, то добавьте \/? вначале). Сложно, не видя всего. Так вроде без ошибок.

Artem-Samsung 12-11-2010 01:36 1540599

В корне:

/
Код:

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]

Sham 12-11-2010 01:45 1540602

а зачем флаг E? он для переменной...

Artem-Samsung 12-11-2010 01:45 1540603

Цитата:

Цитата Sham
а зачем флаг E? он для переменной... »

по дефолту стоял, я и оставил
движок: prestashop

Sham 12-11-2010 02:22 1540614

имхо сервер неправильно декодирует путь и правило получает уже неверную кодировку. Попробуйте вывести, что получает правило (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]

Sham 12-11-2010 05:34 1540644

apache 2.2, htaccess в utf8: если в правиле напрямую кириллицу указывать, то работает, если в 16-ричном (типа \xC1) - то нет. Но при выводе пути (в браузер) кириллица все-равно преобразована неправильно.

Т.е. с кириллицей в пути URLa лучше не связываться, т.к. непонятно, как декодируются из экранированного пути. При этом get-параметры декодируются веб-сервером правильно, как ни странно.

Можно предположить, что экранированный путь декодируется в системную кодировку сервера (в кодировку файловой системы), из-за этого неувязочка.

Artem-Samsung 12-11-2010 10:47 1540796

Цитата:

Цитата Sham
Т.е. с кириллицей в пути URLa лучше не связываться, т.к. непонятно, как декодируются из экранированного пути. При этом get-параметры декодируются веб-сервером правильно, как ни странно. »

а иногда очень нужно.
я вот, если сам какой то движок мини делаю, то с кириллицей поступаю так.
В .htaccess пишу:
Код:

AddDefaultCharset UTF-8
DirectoryIndex index.php
Options +FollowSymlinks
RewriteEngine On

RewriteRule .* index.php

в index.php
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');


ну и т.п.
прокомментриуйте пожалуйста способ))

Sham 12-11-2010 18:40 1541119

если
Цитата:

Цитата Artem-Samsung
mb_convert_encoding »

работает как нужно (на выходе кириллица), и index.php в utf8, то пойдет.
Цитата:

Цитата Artem-Samsung
include(''); »

непонятно.

в правиле можно направлять на этот скрипт только урлы, содержащие нелатиницу [^\w] или [^a-zA-Z0-9\/\-\_\.] - и в таком духе (набор символов определяется на практике).

не спамь в полезняшки


Время: 01:40.

Время: 01:40.
© OSzone.net 2001-