如何通过同一个 PHP 文件处理来自子路径的所有请求?

How to serve all requests from a subpath through the same PHP file?

我正在努力尝试让以下设置在我的机器和 Heroku 上运行:

我在本地使用了不同的 conf 文件(如下),但在 Heroku 上没有任何工作正常。我能想到的最好的是:

location / {
    try_files $uri $uri/ /index.php?$query_string;
    index index.php;
}
location ~ ^/api/(.+) {
    try_files /api/index.php /api/index.php;
}
location ~ \.php(/|$) {
    try_files @heroku-fcgi @heroku-fcgi;
}

如果我尝试使用重写,它会抱怨无限循环。如果我尝试将网关脚本设置为 index 并使用 try_files 及其 FCGI 位置,我会得到 404 - 因为除了该脚本之外 /api 文件夹下没有任何内容。
使用 try_files 并直接指向脚本使 Heroku 直接发送 .php 文件进行下载而不是解释它。我怎样才能让它被解释,并且仍然覆盖所有其他 /api/* 请求?


在我的本地机器上工作的配置文件:

server {
    listen        80;
    server_name   devshop.dev;

    index index.php;
    root  /home/myself/dev/developer-shop/www/;

    location ~ ^/api(/|$) {
        try_files $uri $uri/ /api/index.php;
        include       /etc/nginx/fastcgi_params;
        fastcgi_pass  127.0.0.1:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_split_path_info ^(.+\.php)(/.*)$;
    }

    location ~ \.php(/|$) {
        include       /etc/nginx/fastcgi_params;
        fastcgi_pass  127.0.0.1:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_split_path_info ^(.+\.php)(/.*)$;
    }
}

在您的本地计算机上 PHP 脚本在它们各自的位置块中处理。在您的目标机器上,/api/ 位置执行内部重写,然后 预期 由 php 块处理。

正则表达式位置块已排序,因此 /api/index.php 不断命中 /api/ 位置块 - 因此出现重定向循环。

要么反转正则表达式位置块的顺序,要么更简单地使用带重写的前缀位置块:

location /api {
    rewrite ^ /api/index.php;
}

详情见this document