PHP no alias do diretório NGINX não está funcionando

4

Eu tenho uma nova instalação do servidor Ubuntu 14.04. Eu instalei o nginx, php, etc ....

server {
  listen 80;
  listen [::]:80;

  server_name testone.local;

  root /var/www/htmlone;
  index index.html;

  # pass the PHP scripts to FastCGI server listening on the php-fpm socket
  location ~ \.php$ {
    try_files $uri =404;
    fastcgi_pass unix:/var/run/php5-fpm.sock;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
  }

  location /alias {
    alias  /var/www/htmlalias;
    location ~ \.php$ {
      try_files $uri =404;
      fastcgi_pass unix:/var/run/php5-fpm.sock;
      fastcgi_index index.php;
      fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
      include fastcgi_params;
    }
  }
}

Se eu usar um script php simples em /var/www/htmlone php, execute como esperado. Se eu usar o mesmo script em /var/www/htmlalias , ele não será executado como esperado. Se eu colocar um script HTML em /var/www/htmlalias ele será exibido como esperado, então o alias atua como um alias, mas não executa arquivos php, mas o php funciona no diretório raiz primário.

Eu tenho encontrado em muitas questões de falha de servidor que essa configuração geral deve funcionar, mas não é. Alguém vê alguma coisa que eu possa estar fazendo errado? Não vejo mensagens no log de erros.

Devo acrescentar que isto é para a versão nginx: nginx / 1.8.0

    
por thenetimp 26.05.2015 / 13:18

3 respostas

6

O problema que você está tendo é, na verdade, um bug de longa data que foi registrado há 3 anos , que causa alias e try_files não funcionam realmente juntos.

Na página de bugs, há uma solução de Luke Howell , que é a seguinte:

location /api { ## URL string to use for api ##
    alias /home/api/site_files/; ## Site root for api code ##

    ## Check for file existing and if there, stop ##
    if (-f $request_filename) {
        break;
    }

    ## Check for file existing and if there, stop ##
    if (-d $request_filename) {
        break;
    }

    ## If we get here then there is no file or directory matching request_filename ##
    rewrite (.*) /api/index.php?$query_string;

    ## Normal php block for processing ##
    location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        fastcgi_index index.php;
        include fastcgi_params;
    }
}

Observe que, no que diz respeito ao nginx, SE é mau e deve ser evitado, se possível a>.

    
por 14.06.2015 / 11:05
2

Do meu teste da configuração acima, é a presença de

try_files $uri =404;

dentro do local aliado aninhado do php que causa o problema. Com ele, o nginx verifica "/var/www/htmlalias/alias/index.php" (observe a adição do "alias" mais o uri), descobre que ele não existe e retorna um 404. Removendo o try_files pára primeiro procurando por este arquivo no disco, e passa a requisição diretamente para o fastcgi, que então encontra o arquivo correto do SCRIPT_FILENAME.

Se você quiser que arquivos PHP inexistentes forneçam um erro 404 em vez de um erro do PHP, o seguinte funciona:

  location /alias {
    alias  /var/www/htmlalias;
    location ~ /([^/]+\.php)$ {
      try_files /$1 =404;
      fastcgi_pass unix:/var/run/php5-fpm.sock;
      fastcgi_index index.php;
      include fastcgi_params;
      fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }
  }

Primeiro, o regex captura o nome do arquivo de preenchimento do arquivo php (por exemplo, foo.php) como $ 1. try_files então verifica, em relação ao alias atual, se esse arquivo existe, retornando um 404 se não existir.

Nós então temos que sobrescrever o padrão SCRIPT_FILENAME como definido em fastcgi_params, redefinindo-o após o include, porque $ request_filename irá, por alguma razão eu não entendo, ser totalmente errado (literalmente /index.php). / p>     

por 14.06.2015 / 11:23
0

Foi assim que resolvi:

configuração do servidor padrão (sem alias), no seu exemplo:

server {
  listen 80;
  listen [::]:80;

  server_name testone.local;

  root /var/www/htmlone;
  index index.html;

  # pass the PHP scripts to FastCGI server listening on the php-fpm socket
  location ~ \.php$ {
    try_files $uri =404;
    fastcgi_pass unix:/var/run/php5-fpm.sock;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
  }
}

e a partir da linha de comando, crie um link simbólico em /var/www/htmlone :

ln -s /var/www/htmlalias /var/www/htmlone/alias

    
por 29.10.2017 / 23:17

Tags