使用 nginx 将请求路由到 cgi

使用 nginx 将请求路由到 cgi

我无法将应用程序控制器路由设置从 Apache 转换为 nginx无需使用if,强烈不建议这么做。

我想要的是:如果存在静态文件,则按原样处理请求;如果存在 .php 脚本,则执行它们;并将其他所有内容路由到/index.php$uri(并执行它们)。更具体一点:

$ ls
index.php test.php image.png

GET /                  -> fcgi index.php/
GET /image.png         -> serve static
GET /test.php          -> fcgi test.php
GET /api/v1            -> fcgi index.php/api/v1
GET /api.php           -> fcgi index.php/api.php

在 Apache 中,这将会是类似这样的简单操作,mod_php 会判断生成的 REQUEST_FILENAME 是否为脚本:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^.+$ index.php [L]

在 nginx 中,我无法弄清楚如何让它工作。我目前最好的尝试是这个,但它不起作用,因为它试图 fcgi 任何看起来像脚本的请求,包括那些不存在的请求(参见上面的最后一个例子)。我在 Debian 上使用他们的默认代码片段等:

location / {
    try_files $uri /index.php$uri$is_args$args;
}

location ~ [^/].php(/|$) {
    include snippets/fastcgi-php.conf;
    fastcgi_pass unix:/run/php/php8.2-fpm.sock;
}

使用它if (-e $request_filename)应该try_files是可能的,但由于手册强烈不鼓励使用if,所以我宁愿避免使用它。

我原本以为这对于从 Apache 迁移的软件来说相当常见,但我发现的所有示例要么重定向全部将请求重定向到没有独立脚本的应用程序控制器,或者根本不重定向任何请求,只处理独立脚本。

相关内容