访问 PHP 文件时,nginx 抛出 404 错误

访问 PHP 文件时,nginx 抛出 404 错误

好的,抱歉,最近我问了一些关于 nginx 的问题,这让我很困惑。

我已经使用 fastcgi_php 启用了 PHP,并且它工作正常,但是,当我访问 PHP 文件时,例如

http://domain.com/info.php

(适用于var/www/domain.com/www/info.php

其中包括,phpinfo()如果我访问一个普通文件,nginx 会抛出 404 错误,例如

http://domain.com/index.html

看起来不错......为什么 nginx 无法处理 PHP 文件?

这就是etc/nginx/sites-enabled/domain.com

server {
    listen   80;
    server_name  domain.com *.domain.com;

    access_log /var/www/domain.com/logs/nginx_access.log;
    error_log  /var/www/domain.com/logs/nginx_error.log;

    root   /var/www/domain.com/www/;

    location / {
        index  index.html index.htm index.php;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /var/www/nginx-default;
    }

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

    # Enable PHP
    include /etc/nginx/fastcgi_php;
}

我不知道下一步该做什么......

编辑:

我的/etc/nginx/fastcgi_php

location ~ \.php$ {
    fastcgi_pass   unix:/var/run/php-fastcgi/php.sock;
    fastcgi_index  index.php;
    fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
    include /etc/nginx/fastcgi_params;
}

答案1

首先确保已经安装了 php-cgi apt-get install php5-cgi。接下来为 fastCGI PHP 创建一个启动脚本。

/etc/init.d/fastcgi-php创建包含以下内容的文件:

#!/bin/bash
BIND_DIR=/var/run/php-fastcgi
BIND="$BIND_DIR/php.sock"
USER=www-data
PHP_FCGI_CHILDREN=8
PHP_FCGI_MAX_REQUESTS=1000

PHP_CGI=/usr/bin/php-cgi
PHP_CGI_NAME=`basename $PHP_CGI`
PHP_CGI_ARGS="- USER=$USER PATH=/usr/bin PHP_FCGI_CHILDREN=$PHP_FCGI_CHILDREN PHP_FCGI_MAX_REQUESTS=$PHP_FCGI_MAX_REQUESTS $PHP_CGI -b $BIND"
RETVAL=0

start() {
    echo -n "Starting PHP FastCGI: "
    mkdir $BIND_DIR
    chown -R $USER $BIND_DIR
    start-stop-daemon --quiet --start --background --chuid "$USER" --exec /usr/bin/env -- $PHP_CGI_ARGS
    RETVAL=$?
    echo "$PHP_CGI_NAME."
}
stop() {
    echo -n "Stopping PHP FastCGI: "
    killall -q -w -u $USER $PHP_CGI
    RETVAL=$?
    rm -rf $BIND_DIR
    echo "$PHP_CGI_NAME."
}

case "$1" in
    start)
        start
  ;;
    stop)
        stop
  ;;
    restart)
        stop
        start
  ;;
    *)
        echo "Usage: php-fastcgi {start|stop|restart}"
        exit 1
  ;;
esac
exit $RETVAL

最后运行以下命令(如果在 Debian 中则以 root 身份运行,sudo如果在 Ubuntu 中则使用 root 身份运行)

chmod 755 /etc/init.d/fastcgi-php
update-rc.d fastcgi-php defaults
/etc/init.d/fastcgi-php start

/etc/init.d/nginx reload

现在检查 info.php 文件是否正确显示。

否则,请发布域错误日志和访问日志的输出。

答案2

你从根本上误解了 PHP 如何与 Nginx 协同工作。你认为 Apache == Nginx 的假设是错误的。Nginx 确实不是将 PHP 嵌入其自身,因此如果你尝试访问 PHP 文件,那么 PHP 会抛出 404 错误,并且不是Nginx。

遗憾的是,您隐藏了您的 PHP 配置,include /etc/nginx/fastcgi_php;所以我实际上无法告诉您是否正确配置了 Nginx,所以请提供您的完整配置。

同时,您可以通过检查返回的标头并检查是否有 来验证 PHP 是否确实抛出了 404。X-Powered-By: PHP/5.3.8如果存在,则需要验证您是否通过 SCRIPT_FILENAME fastcgi_param 向 PHP 发送了正确的文件路径。如果该路径正确,则 PHP 无法读取文件,因为权限不正确,这可能是对文件本身的读取访问权限,也可能是对任何父目录的执行访问权限。

相关内容