首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >配置服务器块后接收Nginx '404 Not‘错误

问配置服务器块后接收Nginx '404 Not‘错误
EN

Stack Overflow用户
提问于 2021-05-22 01:34:21
回答 1查看 652关注 0票数 0

我在运行Ubuntu18.04的VPS上安装了nginx。在为域设置DNS记录以指向我的VPS (只是指向VPS的IP的一个A记录)之后,我仍然会得到一个'404 Not‘错误,尽管我相信我的服务器块配置是正确的。我将把配置本身放在下面,因为有些善良的人比我有更多的经验:)

我还包括Certbot在站点使用https之后所做的更改,以及配置中站点的URL。

代码语言:javascript
复制
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


}

这里的错误图像

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-05-22 02:09:53

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

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

此服务器的前三行如下:

代码语言:javascript
复制
    if ($host = huds0n.xyz) {
        return 301 https://$host$request_uri;
    } # managed by Certbot

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

如果这是该主机,则返回301HTTP状态代码(永久移动),新位置为https:// + $host ( FQDN) + $request_uri (在本例中是.xyz之后的位置)。

接下来,我们定义服务器名,它区分此服务器和其他服务器。组合端口+ Server_name使nginx能够知道在处理请求时使用哪种服务器配置。

在本例中,我们位于HTTP未加密端口上,如主机huds0n.xyz的下一行所示。

即使给nginx指定了这个服务器名,如果在listen指令的参数中没有一个listen指示符,那么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查找指令中给出的文件(从左到右)。当您编写文件夹的URL时,Nginx将查找index.html,如果没有找到index.htm等等。

下一个块是网站根目录(/)上的位置块。在这个服务器上提出的每一个请求都与这个块有关。

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

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

下一个位置块涉及与regex匹配的每个文件(这是倾斜的意思),这个regex的意思是每个以.php结尾的文件名。

对于这些文件,我们包括一些configuration配置,它将为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),它处理的每个请求。它是怎么工作的?我们只需将路径信息作为filename + path在FastCGI变量中提供。您可以更改您的块以填充此任务,方法是将其放置而不是try_files指令:try_files $uri $uri/ /index.php?$query_string;

造成此404的根本原因还可能是nginx服务器无法访问该文件夹,或者您的文件夹丢失/空。

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

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67645359

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档