You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 16:50:34