0

这是特定于nginx-unit的,它是来自 NGINX 团队的一些新的迷你 Web 服务器,而不是典型的 nginx + php-fpm 组合。

我按照 nginx-unit symfony 示例一直到精确字节https://unit.nginx.org/howto/symfony/并且它可以工作,除非我尝试访问一个不存在的 PHP 文件,例如/foo/bar.php,我得到一个日志中出现此消息的服务器 500 错误:

PHP Fatal error: Unknown: Failed opening required '/app/public/foor/bar.php' (include_path='.:/usr/share/php') in Unknown on line 0

如果我尝试访问不存在的美学 URL,例如/foo/bar我的应用程序被击中并且使用了预期的 404 逻辑。我希望不存在的 PHP 文件生成正确的 404,但我不清楚如何使用 nginx-unit 执行此操作。

我的配置与示例基本完全相同,我将在此重复:

{
    "listeners": {
        "*:80": {
            "pass": "routes/symfony"
        }
    },

    "routes": {
        "symfony": [
            {
                "match": {
                    "uri": [
                        "*.php",
                        "*.php/*"
                    ]
                },

                "action": {
                    "pass": "applications/symfony/direct"
                }
            },
            {
                "action": {
                    "share": "/path/to/app/public/",
                    "fallback": {
                        "pass": "applications/symfony/index"
                    }
                }
            }
        ]
    },

    "applications": {
        "symfony": {
            "type": "php",
            "user": "app_user",
            "group": "app_group",
            "targets": {
                "direct": {
                    "root": "/path/to/app/public/"
                },

                "index": {
                    "root": "/path/to/app/public/",
                    "script": "index.php"
                }
            }
        }
    }
}

如果我不得不猜测,我会说由于match部分原因,*.php正在尝试在内部进行直接的 PHP 包含操作(在我的应用程序脚本被命中之前)。当错误说Unknown on Line 0这通常意味着除了通过配置之外您无法控制的内部代码。

4

1 回答 1

0

我找到了解决方案。我将 match->uri 部分更改为:

        "match": {
          "uri": [
            "/index.php"
          ]
        }

所做的是,允许作为 PHP 脚本/index.php加载index.php,但如果文件尚不存在,则将任何其他路由(无论是否为 .php)也传递给 index.php。因此,图像、CSS 和其他静态资产仍将正确交付,并且任何不存在的内容都将转到 index.php,因此我的应用程序可以生成 404。

我的应用程序只有一个入口点,index.php但如果我想添加另一个自定义 php 入口点,例如health.php我可以将其显式添加到此 URI 列表中,它也将被允许作为 PHP 执行。

现在我有/并且/index.php要去同一个地方,但我可以让我的应用程序为此进行重定向。

于 2021-01-30T23:00:48.730 回答