Como bloquear a extensão php enquanto ainda roteia muitos endpoint php no nginx

1

Por muitas razões, não queremos / precisamos ter acesso de usuário php diretamente. Na verdade, nosso backend php principalmente serve a API Restful. Apenas uma pequena parte do código serve alguma web MVC. É como descrever abaixo

  1. mywebsite.com/abcsomething.php - > bloqueá-lo (mais difícil de hackear ?!)
  2. mywebsite.com/api/abc?xyz - > api.php (nosso ponto principal da API aqui)
  3. mywebsite.com/utility/abc?xyz - > utility.php (bom código php antigo)
  4. mywebsite.com/admin/abc?xyz - > admin / admin.php (bom e velho código php)
  5. mywebsite.com/everthing_else/something?xyz - > generated / index.html (tudo o mais é exibido como site de página única)

Nós realmente não temos index.php mas muitos php principais descrevem acima.

Eu pesquisei e tentei por quase 4 dias, mas não consegui fazer isso. O que eu tenho até agora:

 ...
 root /www/app;

 ...
 location ~ \.php$ {
        deny all;
 }


 location ^~ /api {

 }

 location ^~ /utility {
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  api.php;

        fastcgi_param  REQUEST_METHOD $request_method;
        fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include        fastcgi_params;
 }

 location ^~ /admin {
        root /www/app/admin
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  api.php;

        fastcgi_param  REQUEST_METHOD $request_method;
        fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include        fastcgi_params;
 }



 location / {
    root /www/app/generated
    try_files $uri /index.html;
 }

 ...

# 1 e # 5 parece funcionar, mas # 2-4 eu tentei muitas técnicas de try_files para reescrever, apelido. Mas como sou inexperiente, consegui que funcionasse. Alguém poderia me dar uma dica

    
por Phung D. An 29.07.2017 / 08:16

1 resposta

1

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.

    
por 29.07.2017 / 11:33

Tags