> > > charset. Т.е. обращение к /dir/ обычно выливается в request к /dir/
> > > и subrequest к /dir/index.html. С моим кодом уже обращение к /dir/
> > > (где никакого языка еще нет) приводит к редиректу если он включен.
> > > Можно переделать, скажите как
> > Мне кажется, что логичней это делать после того как принято решение
> > об добавлении charset в Content-Type, если же нет, то и Redirect не нужен.
> Окончательное решение о добавлении charset принимается, когда уже поздно
> - код операции уже известен.
> > К сожалению, мой любимый способ удаления dirprefix не работает.
> >
> > После:
> > RewriteRule ^/rus/(.*) /$1 [PT,E=FORCE_CHARSET:koi8-r,L]
> Я сразу не въехал в вашу проблему. Теперь въехал. У вас происходит
> автоматический (internal) redirect к _одному_ URL, которыый, вдобавок
> кэшируется т.к. кодировка выбирается через FORCE_CHARSET
>
> Задача CharsetAutoRedirect полностью обратная - раскидать пользователей,
> пришедших на один URL (без кэширования) на _разные_ URL-и (с кэшированием).
> Для вашего сетапа AutoRedirect во-первых не нужен, а во-вторых невозможен
> (т.к. он оринетирован на конструкцию разные кодировки - разные URL).
К сожалению вы меня не правильно поняли, да у меня
'(internal) redirect к _одному_ URL', но снаружи как раз то что делает
AutoRedirect - каждой кодировке свой URL.
А проблема вот в чем:
В request_rec есть два поля:
char *unparsed_uri; /* the uri without any parsing performed */
char *uri; /* the path portion of the URI */
Вы используете uri, а более правильно (на мой взгляд) было бы
использование unparsed_uri, так как могли быть всевозможные internal redirects,
которые затерли все упоминания об dirpref. И в частности по видимому
по этому в cgi-bin передается REQUEST_URI в первозданном виде,
правда для этого вызывается original_uri. Кстати, эта же проблема
привила к появлению FORCE_CHARSET.
После того. как я поменял в check_for_canonic
if(!redir) return 0;
if(!r || !r->unparsed_uri) return 0;
if(r->unparsed_uri[1] == '~') /* /~user form */
uri = strchr(r->unparsed_uri+1,'/');
else
uri = r->unparsed_uri;
то AutoRedirect уже заработал, но я думаю что необходимо заметить
и в других местах, так как кодировка клиента всегда должна определятся
по unparsed_uri.
И по моему остается вопрос когда отдавать AutoRedirect, все таки до
определения языка слишком рано, ведь если документ отсутствует,
то код операции меняется.
>
> Вдогонку. Задать номер порта просто как ...AutoRedirect koi8-r 8080
> нельзя, в 28.1 я сделаю эту возможность как AutoRedirect koi8-r :8080
> Ну и в процессе написания этого письма я понял, что если в AutoRedirect
> задан префикс директории, то с URL типа /~user/ это будет неправильно
> работать. Кстати, ваше rewriterule тоже на них будет обламываться :)
А чем определяется ':'
Вместо:
if(*prefix == ':')
{
/* only port */
redir->port = atoi(prefix+1);
return redir->port ? 1: 0;
}
вполне сработает:
if( (redir->port = atoi(prefix)) != 0 )
return redir->port ? 1: 0; /* only port */
Порт равны 0 вроде нонсенс.
--
С наилучшими пожеланиями, Евгений Бырганов.
Best regards, Eugene Byrganov.
mailto:E.B.Byrganov@inp.nsk.su
work - http://www.inp.nsk.su/
"Russian Apache" includes software developed
by the Apache Group for use in the Apache HTTP server project
(http://www.apache.org/) See
Apache LICENSE.
Copyright (C) 1995-2001 The Apache Group. All rights reserved.
Copyright (C) 1996 Dm. Kryukov; Copyright (C)
1997-2009 Alex Tutubalin. Design (C) 1998 Max Smolev.