Re: perl set: значение $uri при включенном index
Maxim Dounin
mdounin на mdounin.ru
Вс Май 13 17:29:05 UTC 2012
Hello!
On Sun, May 13, 2012 at 12:14:10PM -0400, Budulayj wrote:
> Добрый день.
>
> Пытаюсь использовать perl_set для
> принудительного перевода всех ссылок в
> нижний регистр. При включенной
> директиве index значение переменной $uri в
> блоке perl_set не соответствует значению
> $uri после применения index. То есть при
> открытии "корневой" страницы
> начинается "вечный" редирект. Вывел
> значение переменных $uri и $uri_lowercase в лог -
> $uri определяется как /index.html, $uri_lowercase как
> /. Так и должно быть?
Да. Значение $uri меняется после внутреннего перенаправления на
индексный файл. Значение переменных, полученных через perl_set,
вычисляются один раз на запрос, и при повторных обращениях в
рамках того же запроса - не перевычисляются.
>
> На всякий случай, конфиги такие:
> http {
> ...
> perl_set $uri_lowercase 'sub {
> my $r = shift;
> my $newuri = $r->uri;
> $newuri = lc($newuri);
> return $newuri;
> }';
> ...
> }
>
> server {
> ...
> index index.html index.htm;
> ...
> location / {
> if ( $uri != $uri_lowercase ) {
> rewrite . http://$host$uri_lowercase;
> }
> ...
> }
Работать будет как-то так:
perl_set $uri_not_lowercase 'sub {
my $r = shift;
my $u = $r->uri;
return ($u ne lc($u)) ? "1" : "0";
}';
perl_set $uri_lowercase 'sub {
my $r = shift;
return lc($r->uri);
}';
if ($uri_not_lowercase) {
return 302 $uri_lowercase;
}
Впрочем, проверку "uri не в lowercase" наверное правильнее сделать
вообще на regexp'ах, и не дёргать perl без необходимости.
Maxim Dounin
Подробная информация о списке рассылки nginx-ru