干净的 URL 出现“文件未找到”的情况

干净的 URL 出现“文件未找到”的情况

我已经使用 homebrew 在我的 Mac 上安装了 nginx + php-fpm + mysql 堆栈。

MacOsX:10.9.2
Nginx 版本:1.6.1
文档根目录:/Users/raj/Sites/
项目目录:/Users/raj/Sites/projects/newproject
Url:127.0.0.1/projects/newproject

我的 /usr/local/etc/nginx/nginx.conf 配置如下:

user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

events {
    worker_connections  1024;
}


http {
    include         mime.types;
    #include            /usr/local/etc/nginx/conf.d/*.conf;
    sendfile        on;
    keepalive_timeout  65;

    gzip  on;
    # gzip_disable "MSIE [1-6]\.(?!.*SV1)";

    server {
        listen       80;
        server_name  localhost;
        root  /Users/raj/Sites;

        location / {
            try_files $uri $uri/ /index.php;
            index  index.php;
            autoindex on;
        }

        # configure *.PHP requests
        location ~ \.php$ {
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            include        fastcgi_params;
        }
    }
}  

如果我打开 url:127.0.0.1/projects/newproject或者127.0.0.1/projects/newproject/index.php它可以正常工作。

但如果我打开任何其他 url http://127.0.0.1/projects/newproject/users/login,甚至127.0.0.1/projects/newproject/index.php/users/login都会出现以下错误:

File not found.

并且 error.log 显示:

FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream

[编辑]

如果我在'location〜.php$ {'块中添加以下几行:

try_files       $uri /index.php;

给出错误:

rewrite or internal redirection cycle while internally redirecting to "/index.php"

[编辑2] 此外,当我尝试重新启动 FPM 时,我发现以下错误日志:

[pool www] 'user' directive is ignored when FPM is not running as root
[pool www] 'group' directive is ignored when FPM is not running as root

答案1

您的配置有两个明显的问题:

  1. 您的location @handler完全不必要且多余。这已包含在您现有的indextry_files指令中。将其location完全删除并修复try_files

    try_files $uri $uri/ /index.php;
    
  2. 您将root指令放在了错误的地方。

    root应该在块中定义server,而不是在每个location块中定义。这是最常见的 nginx 配置错误

    root从每个块中删除所有指令location,并将正确的root指令放在server块内,而不是任何内location

一旦您的配置达到这个基线,您就会发现一切又开始工作了,或者您可能会遇到一个更容易处理的其他问题。

答案2

我终于搞明白了。修复起来非常简单。
更改行:

try_files $uri $uri/ /index.php; 

try_files $uri $uri/ /projects/newproject/index.php; 

相关内容