DigitalOcean部署Laravel应用所有路由返回Nginx 404错误如何解决?
Nginx配置错误导致Laravel路由全部404的解决方法
问题根源
你当前生效的HTTPS 443端口server块中,路由请求处理规则不符合Laravel的运行要求:Laravel所有非静态资源请求都需要通过public/index.php入口文件处理,你当前配置里location /段的try_files规则匹配不到文件时直接返回404,没有将请求转发到Laravel入口文件,因此除根域名外所有路由都会触发Nginx 404。
3个server块的作用说明
- 第一个监听80端口的default_server块:完全不生效。第三个server块同样监听80端口,且明确指定了
server_name proclubs.app www.proclubs.app,域名匹配优先级高于默认服务,访问域名的HTTP请求不会走这个块,可直接删除。 - 第二个监听443端口的块:用户访问HTTPS站点时实际生效的块,是配置错误的核心位置。
- 第三个监听80端口的块:Certbot自动生成的规则,作用是将所有HTTP请求301重定向到HTTPS,逻辑正确无需修改。
修复步骤
1. 修改443端口server块配置
将第二个监听443端口的server块替换为以下配置:
server { root /var/www/proclubs/public; index index.php index.html index.htm; charset utf-8; server_name proclubs.app www.proclubs.app; # managed by Certbot # Laravel安全头 add_header X-Frame-Options "SAMEORIGIN"; add_header X-Content-Type-Options "nosniff"; location / { # 匹配不到静态资源则转发到Laravel入口 try_files $uri $uri/ /index.php?$query_string; } location = /favicon.ico { access_log off; log_not_found off; } location = /robots.txt { access_log off; log_not_found off; } # Laravel接管404错误 error_page 404 /index.php; error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/run/php/php7.4-fpm.sock; } # 禁止访问隐藏文件,排除.well-known用于证书续期 location ~ /\.(?!well-known).* { deny all; } listen [::]:443 ssl ipv6only=on; # managed by Certbot listen 443 ssl; # managed by Certbot ssl_certificate /etc/letsencrypt/live/proclubs.app/fullchain.pem; # managed by Certbot ssl_certificate_key /etc/letsencrypt/live/proclubs.app/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 }
2. 校验配置并重载Nginx
执行以下命令验证配置语法是否正确,确认无误后重载配置生效:
sudo nginx -t sudo systemctl reload nginx
3. 可选排查项
如果修改后仍无法正常访问,可依次检查:
- 站点目录权限是否正确:
sudo chown -R www-data:www-data /var/www/proclubs - PHP-FPM服务运行状态:
sudo systemctl status php7.4-fpm - Laravel配置:执行
php artisan route:clear清空路由缓存,确认.env文件中APP_URL已改为https://proclubs.app
内容的提问来源于stack exchange,提问作者Zabs
相关产品推荐
相关产品推荐

