Supondo que quaisquer arquivos de recursos não sejam relativos ao mesmo caminho, sua abordagem é adequada, exceto por alguns problemas.
O SCRIPT_FILENAME precisa apontar para o arquivo de script a ser executado (por exemplo, utility.php). O valor para $fastcgi_script_name é inadequado neste caso, pois será derivado do URI.
Além disso, fastcgi_param declarações devem ser colocadas após include fastcgi_params; , pois o último pode conter declarações conflitantes.
Por exemplo:
location ^~ /api {
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME /path/to/api.php;
fastcgi_pass 127.0.0.1:9000;
}
location ^~ /utility {
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME /path/to/utility.php;
fastcgi_pass 127.0.0.1:9000;
}
location ^~ /admin {
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME /path/to/admin.php;
fastcgi_pass 127.0.0.1:9000;
}
Obviamente, você poderia continuar a construir o SCRIPT_FILENAME usando a variável $document_root como um prefixo, mas isso parece sem sentido para mim por um valor com fio.
O REQUEST_METHOD deve ser definido no arquivo fastcgi_params .
EDITAR:
BTW, I want to do something like remove the "api" prefix and send to php. Like "/api/customer/1" -> will send "customer/1" only to php.
Você precisará identificar qual parâmetro seu script usa para ler o URI, mas será uma das variáveis listadas no arquivo fastcgi_params (por exemplo, REQUEST_URI ).
Você pode alterar a instrução location para uma expressão regular e capturar a parte do URI em que está interessado, por exemplo:
location ~ ^/api(?<name>.*)$ {
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME /path/to/api.php;
fastcgi_param REQUEST_URI $name$is_args$args;
fastcgi_pass 127.0.0.1:9000;
}
Certifique-se de colocar o bloco acima de quaisquer blocos de expressões regulares conflitantes, pois a expressão regular location blocks é avaliada em ordem.