nginx/php/fastcgi: файлы php из вторичных каталогов не оцениваются как php

Я бегу nginx-1.14.0 с php-fpm7.2, Когда я получаю доступ к файлам php, которые находятся в root, они должным образом отправляются через fastcgi, и их php правильно оценивается. Однако, когда я получаю доступ к файлам php - даже с тем же содержимым - из каталогов вторичного сайта, они отправляются обратно как BIN данные и не отправляются через fastcgi для оценки как php.

Вот соответствующие элементы в моем конфигурационном файле nginx...

server {

    ... etc. ...

    root /usr/share/nginx/html;
    index index.php index.html index.htm;

    location / {
        try_files $uri $uri/ =404;
    }

    location ~ ^/(fm)(/?$|/.+\.php) {
        alias /usr/share/nginx/$1$2;
        # I get the same results with "alias $1$2;"
        include phpsite_params;
    }

    location ~ ^/(css|static|img|js)($|/.*) {
        alias $1$2;
    }

    location ~ \.php$ {
        include phpsite_params;
    }
}

/usr/share/nginx/html/index.php Файл правильно проходит через fastcgi и оценивается как php, когда я отправляю этот URL: http://example.com,

Тем не менее /usr/share/nginx/fm/index.php файл просто возвращается мне в виде обычного текста без проверки php при отправке этого URL: http://example.com/fm, а также этот URL: http://example.com/fm/, а также этот URL: http://example.com/fm/index.php,

Вот содержимое phpsite_params...

fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
fastcgi_index index.php;
fastcgi_read_timeout 600;
include fastcgi_params;

... а вот содержимое fastcgi_params...

fastcgi_param   QUERY_STRING        $query_string;
fastcgi_param   REQUEST_METHOD      $request_method;
fastcgi_param   CONTENT_TYPE        $content_type;
fastcgi_param   CONTENT_LENGTH      $content_length;

fastcgi_param   SCRIPT_FILENAME     $request_filename;
fastcgi_param   SCRIPT_NAME         $fastcgi_script_name;
fastcgi_param   REQUEST_URI         $request_uri;
fastcgi_param   DOCUMENT_URI        $document_uri;
fastcgi_param   DOCUMENT_ROOT       $document_root;
fastcgi_param   SERVER_PROTOCOL     $server_protocol;

fastcgi_param   GATEWAY_INTERFACE   CGI/1.1;
fastcgi_param   SERVER_SOFTWARE     nginx/$nginx_version;

fastcgi_param   REMOTE_ADDR         $remote_addr;
fastcgi_param   REMOTE_PORT         $remote_port;
fastcgi_param   SERVER_ADDR         $server_addr;
fastcgi_param   SERVER_PORT         $server_port;
fastcgi_param   SERVER_NAME         $server_name;

fastcgi_param   HTTPS               $https if_not_empty;

# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param   REDIRECT_STATUS     200;

Что я делаю не так в моей конфигурации?

Заранее благодарю за любую помощь или предложения.

ОБНОВЛЕНИЕ: я добавил следующий раздел в мой файл конфигурации nginx, и он работает правильно. Но это местоположение не использует PHP, и, следовательно, похоже, что ошибка связана именно с fastcgi.

    location ~ ^/(junk)($|/.*) {
        alias $1$2;
        autoindex on;
    }

Кто-нибудь может придумать что-нибудь в fastcgi или php-fpm, которое может вызвать проблемы, которые у меня возникают?

1 ответ

Я получил это через много проб и ошибок. Я не уверен, почему я не смог заставить оригинал работать, но следующее работает правильно и возвращает одинаковый результат для всех трех этих URL-адресов... http://example.com/fm, http://example.com/fm/, а также http://example.com/fm/index.php...

rewrite ^/(fm)$ /$1/ permanent;

location ~* ^/(fm)/(.*)$ {
    index index.php;
    alias /usr/share/nginx/$1/$2;
    try_files "" /$1/index.php;
    include phpsite_params;
}

Мне нужно было переписать, потому что я не мог понять, как заставить это работать для http://example.com/fm если шаблон местоположения был таким: ^/(fm)(/?.*)$

/fm/ сайт имеет поддиректории, такие как iconи так относительный URL, такой как icon/icon1.jpg должны работать, в дополнение к /fm/index.php URL-адрес.

Если кто-то может предложить способ сделать все это без rewriteБуду благодарен.

Другие вопросы по тегам