Nginx 找不到 ~/public_html/info.php

Nginx 找不到 ~/public_html/info.php

我是 PHP 新手,想学习它。因此我在计算机上安装了 Nginx、PHP、MariaDB:

  1. Ubuntu 18.04 LTS 64 位。
  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 可以显示 (Hello world),但 info.php (与上面相同) 出现 404。

/etc/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

您的 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

答案2

这是对我有用的方法(灵感来自上一个答案这个要点):

        location ~ ^/~(?<user>.+?)(?<path>/.*)?$ {
                alias /home/$user/public_html$path;
                autoindex on;
                index index.php index.html index.htm;

                location ~ \.php$ {
                        alias /home/$user/public_html;

                        # default fastcgi settings
                        include fastcgi_params;

                        # A bit of added security -- not full proof, but can help
                        fastcgi_split_path_info ^(.+\.php)(/.+)$;
                        # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini

                        # Check that the PHP script exists before passing it
                        if (!-f $document_root/$path) {return 404;}

                        fastcgi_param   SCRIPT_FILENAME $document_root/$path;
                        fastcgi_index index.php;

                        fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
                }
        }

与以前的答案相比,为了在文件系统上正确找到脚本,有什么变化:

  • $request_filename=>$document_root/$path
  • 别名命令

希望这能够帮助任何像我一样来到这里的人们!

相关内容