我在运行Ubuntu18.04的VPS上安装了nginx。在为域设置DNS记录以指向我的VPS (只是指向VPS的IP的一个A记录)之后,我仍然会得到一个'404 Not‘错误,尽管我相信我的服务器块配置是正确的。我将把配置本身放在下面,因为有些善良的人比我有更多的经验:)
我还包括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
}发布于 2021-05-22 02:09:53
让我解释一下你对这个配置做了什么。
您定义了两个虚拟服务器。现在我们放弃第一个,让我们解释第二个:
此服务器的前三行如下:
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配置。我跳过这部分。
我刚才提到的两个问题如下:
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文件夹中。
我希望这将回答你的问题,并帮助你找到一个原因,你的问题。
https://stackoverflow.com/questions/67645359
复制相似问题