Nginx и php -fpm не работает должным образом с вложенными местоположениями - PullRequest
0 голосов
/ 19 января 2020

Я пытаюсь настроить файл конфигурации postfixadmin nginx с вложенными расположениями и застрял с проблемой передачи правильного SCRIPT_FILENAME в php -fpm бэкэнда.

URL, которые должны передается, когда сценарии postfixadmin начинаются с URL / postfixadmin. Часть моего конфигурационного файла, которая обслуживает файлы / postfixadmin, выглядит следующим образом

location ~ ^\/postfixadmin.*(\.php|\.css|\.png|\.gif) {

            location ~ (.*\.php)$ {

                    alias /var/www/postfixadmin/public/;

                    fastcgi_param REQUEST_METHOD $request_method;
                    fastcgi_param SCRIPT_FILENAME $document_root$1;
                    fastcgi_param CONTENT_TYPE    $content_type;
                    fastcgi_param CONTENT_LENGTH  $content_length;
                    fastcgi_param QUERY_STRING    $query_string;

                    fastcgi_pass  127.0.0.1:9000;
                    proxy_read_timeout 500;
            }
       }

И проблема в этом месте

location ~ (.*\.php)$ {

Что я хочу сделать, это обслуживать все usrl, связанные с / postfixadmin и с расширением ". php" как php сценариев и перехват имени сценария как переменная $ 1. Но на самом деле, когда я пытаюсь получить доступ к URL /postfixadmin/index.php, я получаю следующий заголовок

HTTP/1.1 404 Not Found
Server: nginx/1.16.1
Date: Sun, 19 Jan 2020 10:56:13 GMT
Content-Type: text/html; charset=UTF-8
Connection: keep-alive
X-Powered-By: PHP/7.4.1

Так что, как вы можете видеть nginx, правильно выберите местоположение

location ~ ^\/postfixadmin.*(\.php|\.css|\.png|\.gif) {

А затем nginx видит. php в конце URL и пытается отправить это в php -fpm бэкэнд. Но php -fpm отвечает с кодом статуса 404. И это происходит из-за пустого SCRIPT_FILENAME .

Возможно, я ошибаюсь, но я думаю, что проблема в этом месте

location ~ (.*\.php)$ {

Потому что, когда я делаю, это выглядит так , все работает нормально, и я могу передать переменную $ 1 (как имя скрипта) в php -fpm бэкэнд.

location ~ .*\/(.*\.php)$ {

Но указывать. * / перед расположением не имеет смысла (потому что я хочу указать только расширение с именем скрипта) и я просто пытаюсь понять, как это сделать правильно.

Спасибо

1 Ответ

0 голосов
/ 19 января 2020

Хорошо. Я выяснил причину проблемы. Проблема была в моем фиктивном регулярном выражении.

Так что я исправил это

location ~ (.*\.php)$ {

К этому

location ~ ([^\/]*\.php)$ {

Так что я просто исключаю символ "/" from pattern.

Старый тип регулярных выражений включает все до . php плюс целый URL.

Новый включает все после последнего "/"

Вот так!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...