nginx-модуль с PHP генерирует ошибку сервера 500 для любого PHP-файла, который не найден

#php #nginx-unit

#php #nginx-unit

Вопрос:

Это специфично для nginx-unit, несколько нового мини-веб-сервера от команды NGINX, А НЕ типичной комбинации nginx php-fpm.

Я следовал примеру nginx-unit symfony вплоть до точного байта https://unit.nginx.org/howto/symfony / и это работает, за исключением случаев, когда я пытаюсь попасть в PHP-файл, который не существует, например /foo/bar.php , я получаю ошибку Server 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 , что это обычно означает внутренний код, который вы не можете контролировать, кроме как через конфигурацию.

Ответ №1:

Я нашел решение этой проблемы. Я изменил свой раздел match-> uri на этот:

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

Что это сделало, так это разрешить /index.php загрузку index.php в виде PHP-скрипта, но передавать любые другие маршруты, .php или нет, также для index.php если файл еще не существовал. Таким образом, изображения, CSS и другие статические ресурсы по-прежнему будут доставляться правильно, а все, что не существует, будет отправлено в index.php таким образом, 404 может быть сгенерирован моим приложением.

В моем приложении есть только одна точка входа, index.php , но если бы я хотел добавить другую пользовательскую точку входа php, например, health.php я мог бы явно добавить ее в этот список URI, и ей также будет разрешено выполняться как PHP.

Теперь у меня есть / и /index.php собираюсь в то же самое место, но я могу заставить свое приложение сделать перенаправление для этого.

Комментарии:

1. Просто предупреждаю об этом методе: если вы в конечном итоге добавите какой-то другой .php файл в тот же каталог, например, admin.php и НЕ добавите его в этот список совпадений, кому-то может повезти, и он получит к нему прямой доступ, и они увидят исходный код!