Nginx, PATH_INFO e url-rewriting: devo estar faltando alguma coisa

2

Estou mudando do Apache para o Nginx / fcgi e estou tendo um pequeno problema ao tentar configurar as regras de reescrita dos aplicativos.

O código lida com rotas pelo uso de PATH_INFO, por exemplo, example.com/foo/bar/ será roteado para example.com/index.php/foo/bar /

Eu modifiquei a configuração do servidor para passar PATH_INFO:

location ~ \.php$ {
      include /etc/nginx/fastcgi_params;
      fastcgi_pass   127.0.0.1:9000;
      fastcgi_index  index.php;

      fastcgi_split_path_info ^(.+\.php)(.*)$;
      fastcgi_param SCRIPT_FILENAME  /var/www/public$fastcgi_script_name;
      fastcgi_param PATH_INFO $fastcgi_path_info;
      fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
}

E o manipulador de reescrita:

location / {
      root   /var/www/public;
      index  index.html index.htm index.php;

      if (!-f $request_filename) {
        rewrite ^(.*)/(.*)$ /index.php/$2 break;
      }
    }

Com ' rewrite_log on ', a URL parece estar sendo roteada corretamente:

[error]: *2 open() "/var/www/public/index.php/test" failed (20: Not a directory), client: 192.168.0.254, server: example.com, request: "GET /test HTTP/1.1", host: "example.com", referrer: "http://example.com/index.php"

No entanto, parece estar procurando o diretório "test". Como posso forçá-lo a solicitar index.php, passando '/ test' para o script?

    
por ben lemasurier 18.01.2011 / 18:31

1 resposta

3

Bem, você tem vários problemas, em primeiro lugar você está seguindo um tutorial de merda que está severamente desatualizado. if (!-f geralmente não é recomendado com try_files oferecido como um substituto melhor.

Em segundo lugar, você tem diretivas em localização / contexto, que devem estar no contexto do servidor, para que você possa evitar duplicação de caminho na variável SCRIPT_FILENAME.

Em segundo lugar, você usa o sinalizador de quebra na sua reescrita. Isso significa que ele não deve reavaliar a correspondência de local. Isso faz com que a solicitação nunca saia do local / bloco e seja tratada como uma solicitação de arquivo estático.

Em terceiro lugar. Dê uma olhada no seu location ~ \.php$ {

O Nginx combina locais com o URI e você está dizendo especificamente ao Nginx para manipular apenas URIs que terminam em .php, mas se você reescrever para index.php / test /, ele não será acionado.

Por fim. Você está usando PATH_INFO enquanto deveria estar usando REQUEST_URI. A diferença é que para fazer o trabalho PATH_INFO você tem que dizer ao Nginx para passar qualquer requisição com .php para o PHP, e o PHP precisa então encontrar o arquivo correto.

Isso significa que você permite que solicitações como example.org/uploads/image.jpg/index.php sejam enviadas para o PHP e você também permite que o PHP execute o arquivo /uploads/image.jpg. Se um usuário mal-intencionado carregou esse arquivo com o PHP, ele agora tem execução arbitrária de código no seu servidor. Esta é uma exploração muito real a que eu pessoalmente tenho visto pessoas serem vulneráveis.

Por favor, pare de usar tutoriais aleatoriamente no Google, porque 90% deles são lixo, ao invés disso, leia o wiki . Pode ser um incômodo ter que realmente aprender sobre o servidor web que você está usando, mas a alternativa é ter seu servidor comprometido.

    
por 18.01.2011 / 20:18