Ещё раз и подробно + решение проблемы для Win и Denwer 3
Petr_04 29.09.2010 15:09
/ 29.09.2010 15:15
ОС: Windows
Версии ПО:
denwer 3
apache 2.2.4
Задача:Передавать в URL символы кириллицы в формате UTF-8 для разбора и поиска в БД (тэги).
Проблема:$request:uri
$env:QUERY_STRING
Приходят в формате %xx и сравнение со строкой из БД (и в тексте скрипта) в формате UTF не возможно, т.к. строки будут не равны.
Некоторые варианты решения проблемы:1. Самый простой способ (но не подходящий для меня из-за используемых версий ПО) - использовать mod_rewrite с ключом B, как предлагают Misha v.3 и G_Z.
Ключ B появился в 2.2.7, в моём случае 2.2.4, поэтому выдаётся ошибка и в логах появляется запись, что ключ B не опознан.
Передача строки запроса идёт через $form.
2. Кривоватый, но работоспособный.
Передача строки запроса идёт также через $form, но в качестве параметра используем %{THE_REQUEST} - "сырой" запрос. Однако строка с этим запросом будет иметь вид: GET /статьи HTTP/1.1, т.е. содержать лишнюю информацию и требует работы топором (split). После чего, получаем табличку cmd. cmd.1 содержит искомую строку запроса в формате UTF.
.htaccess ErrorDocument 404 /index.html
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^.*$ index.html?req=%{THE_REQUEST} [L]
</IfModule>
index.html $comands[$form:req]
$cmd[^comands.split[^#20;lh]]
Т.к. у меня будет всего один обработчик - index.html, то буду ещё и делить на POST и GET, которые можно брать либо из $env:REQUEST_METHOD либо из разбитой строки (индекс 0).
Возможно есть и другие варианты передачи "сырой" строки запроса.
Буду рад, если кто-то поделится.
Для юникс системы разбиение не потребуется, т.к. там уже будет работать ключ [B], хотя нужно будет ещё посмотреть, как он работает :)