Войти

Показать полную графическую версию : Регулярное выражение. Не работает а-яА-Я


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.

Sham
20-10-2010, 02:22
/инÑ�Ñ‚Ñ?укциÑ�/Ð�бÑ?а-КадабÑ?а/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]

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

Sham
20-10-2010, 02:36
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]
но хотелось бы, как в первом варианте.

Sham
07-11-2010, 16:40
кодировка 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

Sham
07-11-2010, 17:46
пример (любой плагин к 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]

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

Sham
12-11-2010, 00:55
где лежит конфиг, и в какой кодировке сохранен?

Artem-Samsung
12-11-2010, 01:07
где лежит конфиг, и в какой кодировке сохранен? »
если .htaccess имеется ввиду, то utf-8

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

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]

Sham
12-11-2010, 01:45
а зачем флаг E? он для переменной...

Artem-Samsung
12-11-2010, 01:45
а зачем флаг E? он для переменной... »
по дефолту стоял, я и оставил
движок: prestashop

Sham
12-11-2010, 02:22
имхо сервер неправильно декодирует путь и правило получает уже неверную кодировку. Попробуйте вывести, что получает правило (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
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');
}


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

Sham
12-11-2010, 18:40
еслиmb_convert_encoding » работает как нужно (на выходе кириллица), и index.php в utf8, то пойдет.
include(''); »
непонятно.

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

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




© OSzone.net 2001-2012