根本原因是 .htaccess 中 rewriterule 缺少 [qsa] 标志,导致 query_string(如 ?page=2)未被追加;同时需确保 allowoverride all 生效、documentroot 指向 public/ 目录,并验证 .htaccess 文件存在且权限正确。

Apache下Laravel伪静态导致?page=2等GET参数丢失
根本原因是 .htaccess 中的重写规则没保留原始查询字符串,RewriteRule 默认不自动传递 QUERY_STRING,导致 /users?page=2 被重写成 index.php/users,丢掉了 page=2。
官方 public/.htaccess 里这行是关键:RewriteRule ^(.*)$ index.php/$1 [QSA,L] —— [QSA](Query String Append)必须存在,否则所有 GET 参数都会被清空。
- 检查
public/.htaccess是否被手动删改过,确认末尾有[QSA,L],不是[L]或[R] - 若用的是自定义规则(比如复制了旧版 Laravel 或 WordPress 的),务必补上
[QSA] - Apache 2.4+ 下
RewriteCond %{REQUEST_FILENAME} !-f和!-d顺序不能颠倒,否则部分请求可能跳过重写直接返回 404
AllowOverride All 没生效,.htaccess 根本没被读取
即使 .htaccess 写对了,Apache 也会无视它——除非虚拟主机配置里明确允许覆盖。宝塔或手动配置中常见路径错配、值设为 None 或漏掉 Require all granted。
进宝塔 → 网站 → 对应站点 → 配置文件,找到类似 <directory></directory> 的块(注意路径必须和你实际 DocumentRoot 完全一致),里面必须包含:
-
AllowOverride All(不能是FileInfo或None) -
Require all granted(Apache 2.4+ 强制要求,缺了会 403) - 删掉已废弃的
Order allow,deny和Allow from all
改完必须点宝塔「重载配置」,或 SSH 执行 sudo systemctl reload apache2;只点「保存」或重启服务无效。
DocumentRoot 指向错误目录,public/index.php 没被入口路由
Laravel 所有请求必须经由 public/index.php,如果 Apache 的 DocumentRoot 指向项目根目录(如 /www/wwwroot/my-laravel),则 .htaccess 在 public/ 下完全不生效,/login 直接 404,但 /index.php/login 能通——这是典型根目录错位信号。
在宝塔网站设置 → 网站目录 → 运行目录,选 /public;或手动编辑虚拟主机配置,把 DocumentRoot 改成 /www/wwwroot/my-laravel/public。
- 改完后
$_SERVER['DOCUMENT_ROOT']输出应含/public,可用phpinfo()验证 - 确保
public/下有标准.htaccess,且文件权限为 644(非 444 或 755) - 别把
.htaccess放到项目根目录或storage/里,它只在 DocumentRoot 下起作用
APP_URL 和 asset() 生成链接带 index.php,干扰前端请求
虽然不影响后端路由,但前端发的 AJAX 请求(如 axios.get('/api/users'))可能因 APP_URL 配错而拼出带 index.php 的 URL,导致跨域或 404。这不是伪静态失效,但常被误判为 GET 参数问题。
检查 .env 中:
-
APP_URL=https://your-domain.com(末尾不加/,更不能带index.php) -
APP_ENV=production且APP_DEBUG=false(开发环境缓存易掩盖问题) - 执行
php artisan config:clear清掉配置缓存,否则.env修改不生效
如果用了 CDN 或反向代理,还要确认 TRUSTED_PROXIES 和 TRUSTED_HEADERS 设置正确,否则 request()->fullUrl() 可能漏掉 HTTPS 或端口。











