Reescreva o url com o fastcgi no nginx

1

Eu tenho uma configuração fastcgi php em nginx. Agora, tenho poucas solicitações para lidar com, por exemplo, /X.php by /X , /Y.php by /Y Parece simples, então escrevi o seguinte para teste:

rewrite ^/X.php$ /api/v1/stat last;

foi capturado pelo manipulador 404 do aplicativo php. aqui está o log de erros do nginx com rewrite_log em

[notice] 15289#0: *759 "^/X.php$" matches "/X.php", client: 10.0.0.12, server: example.com, request: "GET /X.php HTTP/1.1", host: "example.com"
[notice] 15289#0: *759 rewritten data: "/api/v1/stat", args: "", client: 10.0.0.12, server: example.com, request: "GET /X.php HTTP/1.1", host: "example.com"
[notice] 15289#0: *759 "^/X.php$" does not match "/index.php", client: 10.0.0.12, server: example.com, request: "GET /X.php HTTP/1.1", host: "example.com"

Se eu visitar / api / v1 / stat diretamente, isso funciona:

[notice] 15125#0: *708 "^/X.php$" does not match "/api/v1/stat", client: 223.104.3.248, server: example.com, request: "GET /api/v1/stat HTTP/1.1", host: "example.com"
[notice] 15125#0: *708 "^/X.php$" does not match "/index.php", client: 223.104.3.248, server: example.com, request: "GET /api/v1/stat HTTP/1.1", host: "example.com"

Aqui está minha configuração nginx relacionada:

rewrite ^/X.php$    /api/v1/stat last;

location / {
    try_files $uri $uri/ /index.php;
}

location ~ .*\.php$ {
    try_files $uri =404;
    include        fastcgi_params;
    fastcgi_pass   php;
    fastcgi_index  index.php;
    fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
}

upstream php {
    server unix:/var/run/php-fpm.sock;
}

Por favor me ajude a encontrar uma solução. obrigado.

OBSERVAÇÃO

Um pequeno histórico que pode ajudar você a entender meu problema.

É óbvio que o seguinte deve funcionar e funciona:

rewrite ^/X.php$ /api/v1/stat permanent;

No entanto, estou lidando com algum tipo de hardware que não entende o redirecionamento 301, então estou tentando fazer com o redirecionamento interno sem revelar o redirecionamento.

UPDATE 1

A solução que eu criei é apenas metade. Eu tenho /X.php redirecionado para /api/v1/stat fine. No entanto, nenhum parâmetro pode ser passado após o redirecionamento. Acho que rewrite transmitirá o $args , mas não funciona. Eu estou perdido agora ..

UPDATE 2

Problema resolvido. embora eu ainda não tenha certeza porque $args não está passando adiante.

    
por perlwle 09.06.2015 / 10:19

2 respostas

0

Ativar o modo de depuração nginx e comparar o log entre a solicitação de trabalho e a falha me dá uma pista: a variável nginx REQUEST_URI da solicitação com falha é /X.php e não foi atualizada mesmo após a reconfiguração. consulte o documento nginx sobre variáveis

Portanto, preciso atualizar REQUEST_URI após a reescrita. este post do SO ajuda com isso.

Veja o que funciona para mim:

set $request_url $request_uri;
if ($request_uri ~ ^/X.php(.*)$ ) {
    set $request_url   /api/v1/x$1;
    rewrite ^/X.php    /api/v1/x  last;
}

location ~ .*\.php$ {
    try_files $uri =404;
    include        fastcgi_params;
    fastcgi_pass   php;
    fastcgi_index  index.php;

    fastcgi_param  REQUEST_URI        $request_url;
    fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
}

UPDATE

finalmente, isso também funciona com a string de consulta na reescrita. Adicionei a string de consulta correspondente na cláusula if e anexe a string de consulta correspondente a request_url . problema resolvido.

    
por 10.06.2015 / 10:40
0

reescreva ^ / X.php $ / api / v1 / stat last; envia para "location /"

por exemplo, você pode usar outro local para corresponder a esse redirecionamento interno: "/ api / v1 / stat"

Neste local, você pode passar o pedido para o fcgi-backend (ou modificá-lo adicionalmente neste local).

    
por 09.06.2015 / 17:45

Tags