重写后,nginx 不使用 php-fastcgi

重写后,nginx 不使用 php-fastcgi

我在 nginx 重写方面遇到了问题。我想重写^(.*?)/(.*?)/?$controllers/$1.php?action=$2。之前我在 Apache 服务器上使用这种方法。之后,我想将该文件路由到 php-fastcgi。

对于正常请求(即当我输入完整路径时,不使用重写),php-fastcgi 正常工作。

我的配置:

server {
    listen [::]:80;

    root            /var/www/my-dir;
    index           index.php index.html index.htm;
    charset         utf-8;

    server_name         my-domain;

    location / {
        autoindex   off;
        rewrite     ^(.*?)/(.*?)/?$ controllers/$1.php?action=$2 last;
    }

    location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass    127.0.0.1:9000;
        fastcgi_index   index.php;
        include     fastcgi_params;
    }

    location ~ /\. {
        deny        all;
    }
}

编辑此配置后,我service nginx restart当然做了。

由于某种原因,重写后 php-fastcgi 的位置块不再使用。这是为什么?如何解决?

相反,我收到的响应是“未指定输入文件”。在错误日志中,我看到:

2013/06/01 19:00:25 [error] 14288#0: *1 access forbidden by rule, client: xxx, server: my-domain, request: "GET /user/create HTTP/1.1", host: "my-domain"

答案1

你缺少了try_files

location / {
    try_files $uri $uri/ /index.php;
    # ....everything else
}

您可能还会遇到问题,因为相对 URL 的开头rewrite没有。请尝试将其更改为。/controllers/$1.php.../controllers/$1.php...

而且,您缺少一个 fastcgi 参数,该参数告诉 php-fpm 在哪里找到 PHP 脚本。将其添加到location ~ \.php$块中。

fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;

相关内容