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