1

Я новичок в PHP и хочу изучить его. Поэтому я устанавливаю Nginx, PHP, MariaDB на свой компьютер:

  1. Ubuntu 18.04 LTS 64-bit.
  2. Nginx (не знаю, как проверить версию)
  3. PHP 7.2
  4. По умолчанию www это /var /www /html. Он отлично работает для файлов HTML и PHP. (info.php содержит только phpinfo ();)
  5. Обычный пользователь с каталогом ~ /public_html /index.html и info.php. Может показываться index.html (Привет, мир), но info.php (как и выше) получил 404.

/ И т.д. / Nginx / сайт доступный / по умолчанию

server {
listen 80 default_server;
listen [::]:80 default_server;

root /var/www/html;

index index.php index.html index.htm index.nginx-debian.html;

server_name _;

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

location ~ \.php$ {
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    include snippets/fastcgi-php.conf;
    fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
    include fastcgi_params;
}

location ~ /\.ht {
    deny all;
}

location ~ ^/~(.+?)(/.*)?$ {
    alias /home/$1/public_html$2;
    index index.php index.html index.htm;
    autoindex on;
}
}

Пожалуйста помоги.

1 ответ1

0

У вас есть PHP-файлы в двух корнях, поэтому вам нужно два блока location для обработки этих URI. Самое простое решение - использовать вложенный блок location .

Например:

location / {
    try_files $uri $uri/ =404;
}
location ~ /\.ht {
    deny all;
}
location ~ ^/~(?<user>[^/]+)(?<path>/.*)?$ {
    alias /home/$1/public_html$2;
    index index.php index.html index.htm;
    autoindex on;

    location ~ \.php$ {
        if (!-f $request_filename) { return 404; }
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
        include fastcgi_params;
        fastcgi_param  SCRIPT_FILENAME  $request_filename;
    }
}
location ~ \.php$ {
    ...
}

Поместите внешний блок location ~ \.php$ ниже, иначе он сначала будет соответствовать всем PHP URI. Смотрите этот документ для деталей.

Используйте именованные захваты, поскольку числовые захваты будут выходить за пределы области во вложенном блоке location .

Я не знаю, что находится в вашем файле сниппетов, но вы, вероятно, хотите избежать try_files (из-за этой проблемы с alias), и вам нужно использовать $request_filename чтобы найти путь к SCRIPT_FILENAME .

Блок if добавлен во избежание передачи неконтролируемых запросов в PHP. Смотрите это предостережение по использованию if .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .