我是 PHP 新手,想学习它。因此我在计算机上安装了 Nginx、PHP、MariaDB:
- Ubuntu 18.04 LTS 64 位。
- Nginx(不知道如何检查版本)
- PHP 7.2
- 默认 www 为 /var/www/html。它适用于 HTML 和 PHP 文件。(info.php 仅包含 phpinfo();)
- 具有目录 ~/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
。
答案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
- 别名命令
希望这能够帮助任何像我一样来到这里的人们!