Nginx + PHP-FPM URI 别名和多个 php 目录

cpj*_*s44 5 php nginx web-server php-fpm

我正在尝试将 Nginx 配置为在同一域的两个不同目录中托管多个基于 PHP 的应用程序。我想要达到的结果是:

http://webserver.local/ > 提供的应用程序/path/to/website

http://webserver.local/app > 提供的应用程序/path/to/php-app

这是我的配置。

有人可以解释一下我哪里出错了吗?谢谢 :)

server {
    listen       80;
    server_name  webserver.local;

    location / {
        root   /path/to/website;
        index  index.php;

        location ~ \.php$ {
            root           /path/to/website;
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
            include        fastcgi_params;
        }
    }

    location ^~ /app {
        alias   /path/to/php-app;
        index  index.php;

        location ~ \.php$ {
            root           /path/to/php-app;
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
            include        fastcgi_params;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Ric*_*ith 8

您的嵌套location ~ \.php$块将找不到您的 PHP 脚本。该$document_root设置为/path/to/php-app。并且$fastcgi_script_name$uri仍然包含/app前缀的相同。

正确的方法是使用$request_filename并删除您的虚假root陈述:

location ^~ /app {
    alias   /path/to/php-app;
    index  index.php;

    location ~ \.php$ {
        fastcgi_pass   127.0.0.1:9000;
        include        fastcgi_params;
        fastcgi_param  SCRIPT_FILENAME $request_filename;
    }
}
Run Code Online (Sandbox Code Playgroud)

始终fastcgi_params在任何fastcgi_param语句之前包含,以避免它们被包含文件的内容无声覆盖。有关详细信息,请参阅此文档