Php

“未指定輸入文件”錯誤 - NginX / fcgi - 請求不存在的 .php 文件時

  • October 2, 2015

我讓 NginX 使用 fcgi 為一個 drupal 站點提供服務。嘗試瀏覽到不存在的 php 文件(例如 www.example.com/this-file-doesn't-exist.php)會導致出現以下錯誤的白屏:

‘未指定輸入文件’

我使用這篇文章來幫助我設置 NginX: http ://drupal.org/node/110224

這是我的 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;
}

}

這篇文章http://forum.slicehost.com/comments.php?DiscussionID=1259表明它可能是權限錯誤。但是,我以 user:group nginx:nginx 的身份啟動 fcgi,這與 NginX 執行的使用者相同。

一般來說,配置工作得很好,並且網站 100% 正常工作。只有在請求一個不存在的 .php 文件時才會出現問題。例如,請求一個不存在的 .html 文件會導致 Drupal 為其提供 404 錯誤頁面——這也是我希望對不存在的 .php 文件發生的情況。

附言。如果您想查看該網址,請刪除 http:// 之後的多餘空格 - 我沒有足夠的代表發布多個超連結!

您可以嘗試改用 try_file。

查看Nginx 最佳實踐

例如對於 wordpress。相應地適應。

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;
}

該錯誤實際上是由 PHP over fastcgi 引起的。你會得到與 apache 相同的響應。您可以讓您的網路伺服器在將文件發送到 php.ini 之前檢查該文件是否存在。使用 Apache,您可以使用 mod_rewrite 來執行此操作,但我對 nginx 的了解還不夠,無法幫助您實現它。另一種方法是查看 PHP 是否有一個配置選項,該選項允許您在找不到請求的 php 文件時修改行為。

引用自:https://serverfault.com/questions/48807