Laravel默认分页在Windows10虚拟机上筛选条件丢失问题排查
问题成因及解决方案
1. 分页链接未自动携带筛选参数
这是最常见的原因,Laravel默认的links()方法不会主动将当前请求的筛选查询参数追加到分页链接中,你本地运行正常大概率是巧合(比如临时缓存了筛选参数、本地代码额外做了参数兼容等)。
修复方法:
修改分页渲染代码,手动追加全部当前请求参数:
<div class="col-12">{{$customers->appends(request()->all())->links()}}</div>
如果只需要追加特定筛选参数,也可以指定参数:
{{$customers->appends(['keyword' => request('keyword'), 'subscription_id' => request('subscription_id')])->links()}}
2. Windows虚拟机Web服务器重写规则缺失QSA配置
你本地如果用的是Laravel自带的php artisan serve或集成环境,默认已经配置了正确的重写规则,而你虚拟机上自行配置的Apache/Nginx可能没有开启查询字符串追加配置,导致筛选参数被重写规则丢弃。
修复方法:
- 若用Apache:确保
public目录下的.htaccess文件的重写规则带有QSA标志:
RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^ index.php [QSA,L]
- 若用Nginx:确保站点配置的
location段保留了$query_string参数:
location / { try_files $uri $uri/ /index.php?$query_string; }
3. 筛选请求方法与Session配置异常
如果你的筛选表单用的是POST提交,第一页可以拿到POST参数,但是分页跳转是GET请求,本身不会携带POST参数。如果本地正常是因为你把筛选条件存入了Session,那虚拟机上可能是Session写入权限不足导致参数丢失。
修复方法:
- 优先将筛选表单的提交方法改为GET,让筛选参数直接暴露在URL中,逻辑更直观也更好维护。
- 如果必须用POST存Session,给虚拟机上Laravel项目的
storage目录开通读写权限:右键storage目录,给所属用户组赋予读写权限,同时确认.env中的SESSION_DOMAIN配置和你访问虚拟机站点的域名一致。
内容的提问来源于stack exchange,提问作者fael_
相关产品推荐
相关产品推荐

