Debian环境下Laravel+Nginx路由调优:基础路由返回404问题
解决Laravel 5.4 + Nginx路由404问题
我之前调试Laravel+Nginx的时候也碰到过一模一样的问题,核心原因基本都是Nginx没有正确把请求转交给Laravel的入口文件处理,或者root路径配置错了。给你一步步排查和解决的方案:
1. 修正Nginx的Root路径
你的Nginx配置里root /srv/www;指向的是网站根目录,但Laravel的入口文件在project/public下,所以需要把root路径调整为Laravel项目的public目录:
root /srv/www/project/public;
这样Nginx才能正确找到Laravel的index.php入口文件,后续访问也不需要在URL里加project/public了。
2. 配置正确的请求重写规则
在location /块里,必须添加try_files指令,让Nginx把不存在的文件/路径转发给index.php处理(也就是交给Laravel路由解析):
location / { # 优先尝试静态文件,不存在则转交给Laravel入口 try_files $uri $uri/ /index.php?$query_string; }
这一步是关键——没有这个规则,Nginx会直接对未匹配到静态文件的请求返回404,不会把请求传给Laravel的路由系统。
3. 确保PHP-FPM配置正确
还要检查Nginx处理PHP的配置块,确保能正确解析PHP文件,示例配置如下:
location ~ \.php$ { include snippets/fastcgi-php.conf; # 注意:这里的PHP-FPM地址要和你系统里的版本匹配,Laravel5.4最低支持PHP7.0 fastcgi_pass unix:/run/php/php7.0-fpm.sock; # 必须配置这个参数,让PHP-FPM能找到正确的脚本文件 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; }
4. 重启服务并清除Laravel缓存
完成配置修改后,重启Nginx让配置生效:
sudo systemctl restart nginx
然后进入Laravel项目目录,清除路由和缓存,避免旧缓存干扰:
cd /srv/www/project php artisan route:clear php artisan cache:clear
5. 检查文件权限
最后确保Laravel的存储目录有正确的权限,避免权限问题导致的隐性异常:
sudo chown -R www-data:www-data /srv/www/project/storage /srv/www/project/bootstrap/cache sudo chmod -R 755 /srv/www/project/storage /srv/www/project/bootstrap/cache
把这些步骤做完后,再访问http://localhost/foo,应该就能正常返回"Hello World"了。
内容的提问来源于stack exchange,提问作者MyNick




