'Nenhum arquivo de entrada especificado' - NginX / fcgi - ao solicitar arquivo .php inexistente

3

Eu tenho o NginX servindo um site drupal usando o fcgi. A tentativa de navegar para um arquivo php inexistente (por exemplo, www.example.com/this-file-doesn't-exist.php) resulta em uma tela branca com este erro:

'Nenhum arquivo de entrada especificado'

Eu usei este post para me ajudar a configurar o NginX: link

Este é o meu arquivo de configuração do NginX:

server {
listen 1.2.3.4:80 default;
server_name www.example.com;

client_max_body_size 6M;

root /var/www/example.com/;
index index.php;

error_page 404 /index.php;
error_page 403 /403.html;

# set up a location to serve static images for static error pages
location ^~ /error_images/ {
  root   /var/www/static_pages/error_pages;
  access_log        off;
  expires           30d;
}

# use our own custom 403 page
location = /403.html {
  root   /var/www/static_pages/error_pages;
}

# redirect server error pages to the static page /50x.html
error_page 500 502 503 504  /50x.html;
location = /50x.html {
  root   /var/www/static_pages/error_pages;
}

location / {
  error_page 404 index.php;
  error_page 403 /403.html;

  # the main drupal app
  if (!-e $request_filename) {
    rewrite ^/(.*)$ /index.php?q=$1 last;
  }
}

# hide protected files
location ~* \.(engine|inc|info|install|module|profile|po|sh|.*sql|theme|tpl(\.php)?|xtmpl)$|^(code-style\.pl|Entries.*|Repository|Root|Tag|Template)$ {
  deny all;
}

# serve static files directly
location ~* ^.+\.(jpg|jpeg|gif|css|png|js|ico)$ {
    rewrite ^/favicon.ico$ /sites/example.com/themes/exampletheme/favicon.ico break;
    access_log        off;
    expires           30d;
}

# imagecache needs to have php read any files that it's planning to manipulate
location ^~ /sites/example.com/files/imagecache/ {
   index  index.php index.html;
   # assume a clean URL is requested, and rewrite to index.php                                                                
    if (!-e $request_filename) {
        rewrite  ^/(.*)$  /index.php?q=$1  last;
        break;
    }
}

# serve the app via fastcgi
location ~ \.php$ {
    # ensure that a 404 is returned if a non existant php file is requested
    # doesn't seem to work properly, so commenting out
    # fastcgi_intercept_errors  on;
    fastcgi_pass unix:/tmp/php-fastcgi.sock;
    fastcgi_index index.php;
    fastcgi_read_timeout 240;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include /etc/nginx/fastcgi_params;
}

# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
location ~ /\.ht {
     deny  all;
}

}

Este post link sugere que pode ser um erro de permissão. No entanto, eu inicio o fcgi como o usuário: group nginx: nginx, que é o mesmo usuário que o NginX executa como.

Em geral, a configuração funciona bem, e o site funciona 100% como deveria. É somente quando solicitando um arquivo .php que não existe que o problema ocorre. Solicitar um arquivo .html que não exista, por exemplo, resulta no Drupal atendendo a sua página de erro 404 - que é o que eu quero que aconteça também com arquivos .php inexistentes.

ps. Se você quiser ver esse URL, por favor, remova o espaço em branco extra após http: // - Eu não tenho o suficiente para postar mais de um hiperlink!

    
por user15241 01.08.2009 / 13:55

5 respostas

5

Você pode tentar usar o try_file.

Veja Melhores práticas do NGinx

Por exemplo, para wordpress. Adapte-se adequadamente.

location /wordpress {
    try_files $uri $uri/ @wordpress;
}

location @wordpress {
   fastcgi_pass 127.0.0.1:9000;
   fastcgi_split_path_info ^(/wordpress)(/.*)$;
   fastcgi_param SCRIPT_FILENAME /var/www/wordpress/index.php;
   fastcgi_param PATH_INFO $fastcgi_path_info;
}
    
por 05.08.2009 / 12:13
2

O erro é causado pelo PHP sobre o fastcgi. Você obtém a mesma resposta com o apache. Você pode causar o seu servidor para verificar se o arquivo existe antes de enviá-lo para php. Com o Apache, você poderia fazer isso usando o mod_rewrite, mas eu não sei o suficiente sobre o nginx para ajudá-lo a implementá-lo. A alternativa é verificar se o PHP tem uma opção de configuração que permitiria modificar o comportamento quando ele não encontrar o arquivo php para o pedido.

    
por 01.08.2009 / 22:13
0
    location ~ \.php$ {
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME /var/www/domain.com/public/$fastcgi_script_name;
        include        fastcgi_params;
    }

esta configuração funciona bem para mim.

    
por 14.07.2011 / 11:42
0

Eu também estava tendo o mesmo problema. Acabei de adicionar meu diretório raiz da web na linha

 SCRIPT_FILENAME /web/root/$fastcgi-script_name; 

e agora está funcionando como um encanto.

    
por 20.02.2013 / 11:45
0

Por favor inclua a seguinte linha em fastcgi_params

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    
por 02.12.2010 / 16:35