Laravel应用部署到虚拟主机后分页链接异常问题排查
问题根源与解决方案
你的问题核心出在.htaccess里的Rewrite规则写法上,导致框架生成AJAX分页URL时错误地带上了当前页面的路径参数。
具体原因分析
本地环境(比如PHP内置服务器php -S localhost:8000)的路由处理逻辑和Apache的Rewrite规则不同,它不需要依赖.htaccess就能正确解析路径,所以你的AJAX分页链接能正常生成。
但部署到Apache虚拟主机后,你的Rewrite规则是这样的:
RewriteRule ^(.*)$ index.php?/$1 [L]
这个规则会把所有非文件/目录的请求重定向到index.php?/xxx,也就是把请求路径作为查询参数传递给index.php。此时,当你在/exampleroute页面发起AJAX请求时,框架会错误地将当前页面的查询参数(也就是/exampleroute)合并到新的分页URL里,经过URL编码后就变成了%2Fexampleroute=,最终生成异常的链接https://example.com/content/page_comments?%2Fexampleroute=&page=2。
修复方案
修改.htaccess里的RewriteRule,把查询参数的写法改为PATH_INFO模式:
<IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d # 把原来的 ?/$1 改成 /$1 RewriteRule ^(.*)$ index.php/$1 [L] </IfModule> <IfModule !mod_rewrite.c> ErrorDocument 404 /index.php </IfModule>
如果你的框架支持更简洁的写法,也可以把RewriteRule简化为:
RewriteRule ^ index.php [L]
这样修改后,Apache会把请求路径作为PATH_INFO传递给index.php,框架就能正确生成AJAX分页URL,不会再附加多余的参数了。
内容的提问来源于stack exchange,提问作者Solivan




