Laravel文件路由在Nginx环境下返回404错误的解决咨询
解决Laravel路由在Nginx+Plesk生产环境下的404问题
问题核心
本地环境正常,但生产环境中Nginx直接尝试访问URL对应的物理文件,而非将请求交给Laravel路由处理,导致带文件名后缀的路由返回404。
解决方案
1. 覆盖Plesk默认的静态文件拦截规则
Plesk会自动为PDF、图片等静态文件后缀生成独立的Nginx location规则,优先拦截这类请求,跳过Laravel的路由处理。需要针对目标路由做特殊处理:
方案A:单独为lesson-attachment路由设置优先匹配
在Nginx配置中添加前缀优先匹配的location,确保该路径下的所有请求都交给Laravel处理:
# 优先处理lesson-attachment开头的请求,绕过静态文件规则 location ^~ /lesson-attachment/ { try_files $uri /index.php?$query_string; } # 保留Plesk默认的静态文件规则(可根据实际需求调整后缀) location ~* \.(pdf|jpg|jpeg|png|gif|css|js)$ { try_files $uri =404; }
方案B:修改静态文件规则,不存在则转Laravel
如果希望所有静态文件不存在时都走Laravel路由,可以调整静态文件location:
location ~* \.(pdf|jpg|jpeg|png|gif|css|js)$ { try_files $uri /index.php?$query_string; }
2. 确认Nginx根目录指向正确
由于使用PHP Deployer部署,current是指向最新版本的软链接,需确保Nginx的root配置指向Laravel的public目录:
server { # 注意末尾的/public,不要只指向current目录 root /var/www/vhosts/example.com/httpdocs/current/public; # ...其他配置 }
3. 验证PHP处理配置正确性
确保Nginx有正确的PHP解析规则,保证index.php能正常处理请求:
location ~ \.php$ { # 根据你的PHP版本调整socket路径 fastcgi_pass unix:/var/run/php/php8.2-fpm.sock; fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name; include fastcgi_params; }
4. 清理缓存并重启服务
- 测试Nginx配置并重启:
sudo nginx -t sudo systemctl reload nginx
- 清理Laravel路由缓存:
cd /var/www/vhosts/example.com/httpdocs/current php artisan route:clear
原因说明
本地Laravel Valet的Nginx配置默认不会拦截带后缀的路由请求,而Plesk为了性能优化,默认给常见静态文件后缀配置了独立的location规则,优先处理这类请求,导致Laravel的路由无法捕获带.pdf等后缀的URL请求。
内容的提问来源于stack exchange,提问作者ysfkaya
相关产品推荐
相关产品推荐

