请求不存在的 .php 文件时出现“未指定输入文件”错误 - NginX / fcgi

请求不存在的 .php 文件时出现“未指定输入文件”错误 - NginX / fcgi

我使用 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:// 后的多余空格 - 我的代表数量不足以发布多个超链接!

答案1

您可以尝试使用 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;
}

答案2

该错误实际上是由 PHP 通过 fastcgi 引起的。使用 apache 时,您会得到相同的响应。您可以让 Web 服务器在将文件发送到 php 之前检查该文件是否存在。使用 Apache,您可以使用 mod_rewrite 来执行此操作,但我对 nginx 了解不够,无法帮助您实现它。另一种方法是查看 PHP 是否有一个配置选项,当它找不到请求的 php 文件时,该选项允许您修改行为。

答案3

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

这个配置对我来说很好。

答案4

请在 fastcgi_params 中包含以下行

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

相关内容