Por que o redirecionamento interno nginx não está acontecendo

1

Tenho certeza que perdi uma coisa óbvia, mas isso está me deixando louca, eu preciso de outros olhos ...

Eu tenho um aplicativo com plugins onde as fontes são organizadas como:

/ app / plugins / foo / www / ... que corresponde ao meu URL link ...

Eu recebi o seguinte snippet como configuração nginx:

location /plugins/foo {
    alias /app/plugins/foo/www;
    try_files $uri /index.php =404;
}

location ~* ^/plugins/foo/(.*\.php)$ {
    alias /app/plugins/foo/www/$1;

    fastcgi_pass 127.0.0.1:9000;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
}

Funciona bem para URLs como:

Mas assim que estou tentando alcançar (padrão de front controller):

Eu tenho que baixar o arquivo php.

De acordo com os logs, o try_files parece fazer o que é esperado, mas em vez do redirecionamento interno para o manipulador php, o servidor é o arquivo como static:

2017/01/24 13:29:36 [debug] 20803#0: *6 using configuration "/plugins/foo"
2017/01/24 13:29:36 [debug] 20803#0: *6 http cl:-1 max:1048576
2017/01/24 13:29:36 [debug] 20803#0: *6 rewrite phase: 3
2017/01/24 13:29:36 [debug] 20803#0: *6 post rewrite phase: 4
2017/01/24 13:29:36 [debug] 20803#0: *6 generic phase: 5
2017/01/24 13:29:36 [debug] 20803#0: *6 generic phase: 6
2017/01/24 13:29:36 [debug] 20803#0: *6 generic phase: 7
2017/01/24 13:29:36 [debug] 20803#0: *6 generic phase: 8
2017/01/24 13:29:36 [debug] 20803#0: *6 access phase: 9
2017/01/24 13:29:36 [debug] 20803#0: *6 access phase: 10
2017/01/24 13:29:36 [debug] 20803#0: *6 post access phase: 11
2017/01/24 13:29:36 [debug] 20803#0: *6 try files phase: 12
2017/01/24 13:29:36 [debug] 20803#0: *6 http script var: "/plugins/git/"
2017/01/24 13:29:36 [debug] 20803#0: *6 trying to use file: "/" "/app/plugins/foo/www/"
2017/01/24 13:29:36 [debug] 20803#0: *6 trying to use file: "/index.php" "/app/plugins/foo/www/index.php"
2017/01/24 13:29:36 [debug] 20803#0: *6 try file uri: "/plugins/foo/index.php"
2017/01/24 13:29:36 [debug] 20803#0: *6 content phase: 13
2017/01/24 13:29:36 [debug] 20803#0: *6 content phase: 14
2017/01/24 13:29:36 [debug] 20803#0: *6 content phase: 15
2017/01/24 13:29:36 [debug] 20803#0: *6 content phase: 16
2017/01/24 13:29:36 [debug] 20803#0: *6 content phase: 17
2017/01/24 13:29:36 [debug] 20803#0: *6 content phase: 18
2017/01/24 13:29:36 [debug] 20803#0: *6 http filename: "/app/plugins/foo/www/index.php"
2017/01/24 13:29:36 [debug] 20803#0: *6 add cleanup: 000000000153FF70
2017/01/24 13:29:36 [debug] 20803#0: *6 http static fd: 13
2017/01/24 13:29:36 [debug] 20803#0: *6 http set discard body
2017/01/24 13:29:36 [debug] 20803#0: *6 xslt filter header
2017/01/24 13:29:36 [debug] 20803#0: *6 HTTP/1.1 200 OK 

Então, a questão é: como implementar meu padrão de controlador front-end nessa situação?

EDITAR

com

location /plugins/foo {
    alias /app/plugins/foo/www;
    try_files $uri /plugins/foo/index.php?$args;
}

Eu fui redirecionado para o front-controller Core em vez dos plugins:

2017/01/25 13:45:48 [debug] 14086#0: *197 using configuration "/plugins/foo"
...
2017/01/25 13:45:48 [debug] 14086#0: *197 try files phase: 12
2017/01/25 13:45:48 [debug] 14086#0: *197 http script var: "/plugins/foo/"
2017/01/25 13:45:48 [debug] 14086#0: *197 trying to use file: "/" "/app/plugins/foo/www/"
2017/01/25 13:45:48 [debug] 14086#0: *197 http script copy: "/plugins/git/index.php?"
2017/01/25 13:45:48 [debug] 14086#0: *197 http script var: "group_id=101"
2017/01/25 13:45:48 [debug] 14086#0: *197 trying to use file: "/index.php?group_id=101" "/app/plugins/foo/www/index.php?group_id=101"
====> ??? 2017/01/25 13:45:48 [debug] 14086#0: *197 internal redirect: "/index.php?group_id=101"
2017/01/25 13:45:48 [debug] 14086#0: *197 rewrite phase: 1
...

Por que redirecionar para /index.php?group_id=101 quando /app/plugins/foo/www/index.php?group_id=101 é válido?

    
por Manuel VACELET 25.01.2017 / 13:38

1 resposta

2

Para evitar o problema de longa data com o uso de alias junto com try_files , você poderia usar um if block (tomando cuidado para observar restrições de uso ). Observe também que $request_filename é usado em vez de $document_root$fastcgi_script_name para obter nomes de caminho com alias.

Eu testei este exemplo:

location ^~ /plugins/foo {
    alias /app/plugins/foo/www;

    if (!-e $request_filename) {
        rewrite ^ /plugins/foo/index.php last;
    }

    location ~ \.php$ {
        if (!-f $request_filename) {
            rewrite ^ /plugins/foo/index.php last;
        }
        fastcgi_pass 127.0.0.1:9000;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $request_filename;
    }
}
  • O modificador ^~ faz com que esse bloco location tenha precedência sobre outros location blocos no mesmo nível (consulte este documento ).
  • A instrução rewrite anexa automaticamente argumentos (consulte este documento ).
  • O bloco location aninhado manipula arquivos PHP dentro do escopo de alias.
  • Sempre include fastcgi_params; antes usando fastcgi_param para evitar que o último seja sobrescrito silenciosamente pelo arquivo incluído.
por 25.01.2017 / 17:51

Tags