Здравствуйте!
я пытался организовать рерайты на своем девелопмент сервере и столкнулся со странным багом.
есть папка с проектами ($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"