配置服务器块后收到 nginx"404 未找到"错误



我在运行Ubuntu 18.04的VPS上安装了nginx。在为域设置DNS记录以指向我的VPS(只是一个指向VPS IP的A记录)后,我仍然会收到"404未找到"错误,尽管我认为我的服务器块配置是正确的。我将把配置本身留在下面,因为有些善良的人比我更有经验:)

附言:我还包括了Certbot在该网站使用https后所做的更改,以及配置中该网站的URL。

server {
root /root/web/hudson/main;
index index.html index.htm index.nginx-debian.html;
server_name huds0n.xyz;
location / {
try_files $uri $uri/ =404;
}

location ~ .php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php7.2-fpm.sock;
}

listen 443 ssl; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/huds0n.xyz/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/huds0n.xyz/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}
server {
if ($host = huds0n.xyz) {
return 301 https://$host$request_uri;
} # managed by Certbot

server_name huds0n.xyz;
listen 80;
return 404; # managed by Certbot

}

此处的错误图像

让我解释一下您对这个配置做了什么。

您定义了两个虚拟服务器。我们暂时放弃第一个,让我们来解释第二个:

该服务器的前三行如下:

if ($host = huds0n.xyz) {
return 301 https://$host$request_uri;
} # managed by Certbot

在第一行中,我们检查nginx给出的$host变量是否为huds0n.xyz。它是从HTTP请求的Host请求头中提取的。

如果这是该主机,我们将返回一个301 HTTP状态代码(永久移动),新位置为https://+$host(FQDN)+$request_uri(在我们的情况下,.xyz后面是什么)。

接下来,我们定义服务器名称,将此服务器与其他服务器区分开来。Port+Server_name的组合使nginx能够知道在处理请求时使用哪个服务器配置。

在这种情况下,我们在HTTP未加密端口上,如主机huds0n.xyz.的下一行所示

即使将此服务器名称指定给nginx,如果在listen指令的参数中没有default_server指示,nginx也可能使用此服务器来处理请求。

接下来我们返回一个404未找到错误。最后,对于这个虚拟服务器,只有在不使用huds0n.xyz主机的情况下,我们才会得到404。(例如,如果你没有任何其他东西阻止它使用浏览器中的服务器IP来查看你是否被重定向,请尝试)。

现在,我们有了第一个服务器块,它定义了服务器的SSL/TLS部分。

我看到此配置有两个问题,但我将首先解释您的配置目前的作用。

您可以在/root/web/hudson/main文件夹中定义根位置。它必须是一个文件夹。

因此,如果您在浏览器中编写https://huds0n.xyz/i-like-bananas.html,它将在主文件夹中检索i-like-bananas.html

下面一行是index指令。让我们想象一下,在您的主文件夹中,有一个名为strawberry的文件夹和另一个名称为raspberry的文件夹。在strawberry中,您有一个名为index.html的文件,其中包含一张美丽的草莓图片。在raspberry中,不幸的是网站管理员忘记放这样一个文件。

使用index指令,您可以告诉nginx查找指令中给定的文件(从左到右的顺序)。Nginx会,当你写一个文件夹的URL时,寻找index.html,然后如果没有找到index.htm,以此类推

下一个块是网站根上的位置块(/)。此服务器上的每个请求都与此块有关。

try_files指令类似于index指令,但它是由每个URL触发的,而不仅仅是与文件夹关联的URL。

它将尝试URI(主机后URL的右侧部分),然后将URI作为文件夹,否则将返回404错误(未找到)。

下一个位置块涉及与正则表达式匹配的每个文件(这是波浪号的意思),而正则表达式的意思是以.php结尾的每个文件名。

对于这些文件,我们包含了一些fastcgi-php配置,它将为php提供处理请求所需的变量,并将请求和变量传递到位于/run/php/php7.2-fpm.sock中的unix套接字。

之后,我们有了使nginx在HTTPS端口上侦听的指令,以及SSL/TLS配置。我跳过这部分。

我之前提到的两个问题如下:

  • 您想要使用PHP,但是您的索引指令指向HTML文件。如果您想将index.php用于根网页,请将其更改为index index.php

  • 在您的位置/块中,您尝试$uri,$uri加上斜杠,然后返回404。许多CMS/Framework(例如,我认为是laravel)使URL的重写成为可能。您有一个PHP文件(例如index.PHP),它处理每个请求。它是如何工作的?我们只是在FastCGI变量中将路径信息作为filename + path提供给PHP。您可以更改您的区块以完成此任务,方法是放置此指令而不是try_files指令:try_files $uri $uri/ /index.php?$query_string;

这个404的根本原因也可能是你的nginx服务器无法访问文件夹,或者你的文件夹丢失/为空。

按照最初的设计,您的web内容应该位于/var/www/<subfolder>文件夹中,并归www-data所有。

您不应该将文件放在/root文件夹中。

我希望这能回答你的问题,并帮助你找到问题的原因。

相关内容

  • 没有找到相关文章