Здравствуйте!

я пытался организовать рерайты на своем девелопмент сервере и столкнулся со
странным багом.
есть папка с проектами ($document_root), в ней находятся папки которые
соответствуют названиям проектов ($prjct_folder), и в папке проекта есть
папка с исходниками ($prjct_src - ее название по умолчанию src, но могут
быть другие src2, src_old, ...). 

стояла задача при обращении по адресу (ЧПУ)

http://dev_hos/project_name/src/badurl

и адресу

http://dev_hos/project_name/badurl

перенаправлять оба логически одинаковых URL на исполнение скрипту:

/var/www/project_name/src/index.php

----------------------------------------------------------------------------

для реализации я создал конфиг похожий на этот (максимально упрощенный
вариант)

----------------------------------------------------------------------------

server
{
        listen          80;
        server_name     bug;
        root            /var/www;

        set     $prjct_folder   '';
        set     $prjct_src      'src';
        set     $prjct_uri      '';

        location /
        {

                add_header      Content-Type    'text/html; charset=UTF-8';
                return          200             other;
                
        }

        location ~*     ^/([^/]+)/?(src[^/]*)?/?(.*)
        {
                        set     $prjct_folder   $1;
                        set     $tmp_src        $2;
                        set     $prjct_uri      $3;

                if ($tmp_src)
                {
                        set     $prjct_src      $tmp_src;
                }

                try_files       $uri    @notfound;

#               add_header      Content-Type    'text/html; charset=UTF-8';
#               return          200             
$document_root/$prjct_folder/$prjct_src/$prjct_uri;
        }

        location @notfound
        {
                add_header      Content-Type    'text/html; charset=UTF-8';
                return          200             
$document_root/$prjct_folder/$prjct_src/$prjct_uri;
        }
}

----------------------------------------------------------------------------

логика работы следующая: при обращении к серверу, ЧПУ попадает на обработку
в блок с регулярным выражением, регулярное выражение извлекает из него
название папки проекта и название папки с исходниками (если такова в адресе
есть) и перенаправляет в блок @notfound который вызывает нужный скрипт
(логику вызова скрипта я убрал, оставил только инструкции для дебага)

----------------------------------------------------------------------------

баг заключается в том, что при обращении по адресу вида (содержит src)

http://dev_hos/project_name/src/badurl

nginx выдает 404 проходя мимо блоков @notfound и /

при заходе на адрес без src

http://dev_hos/project_name/badurl

nginx корректно переходит в блок @notfound

----------------------------------------------------------------------------

в лог nginx попадает следующая ошибка:

#[error] 4288#0: *1 open() "/var/www/project_name/src/badurl" failed (2: No
such file or directory), client: 192.168.234.1, server: bug, request: "GET
/project_name/src/badurl HTTP/1.1", host: "bug"

Posted at Nginx Forum: 
http://forum.nginx.org/read.php?21,256033,256033#msg-256033

_______________________________________________
nginx-ru mailing list
nginx-ru@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-ru

Ответить