Apache如何通过PT passthrough定义索引页并保留查询字符串?
Apache重写规则保留查询参数解决方案
你的核心需求是将根目录请求(www.oursite.com)内部指向语言子目录的页面(如/en/home.html),同时保留原URL和查询参数。
关键结论:无需手动拼接查询参数
你最初的配置本就应该保留查询参数,因为Apache的RewriteRule默认行为是:当目标URL不包含问号时,原始查询字符串会自动附加到目标URL之后,完全不需要手动处理。
修正笔误(你示例中/pt/home.html和需求的/en/home.html不一致)后的正确配置:
RewriteRule "^$" "/en/home.html" [PT]
当用户访问www.oursite.com?affiliate=123时,内部会自动重写到/en/home.html?affiliate=123,URL依然显示为www.oursite.com?affiliate=123,页面可正常读取参数。
若参数仍丢失的排查方向
如果实际测试中参数确实丢失,可能是以下原因:
- 存在其他冲突的
RewriteRule或RewriteCond规则,干扰了参数传递 - 服务器配置中
AllowOverride未正确设置,导致重写规则未生效 - 目标页面(
/en/home.html)本身未正确读取查询参数
特殊场景:追加额外参数
如果需要在保留原始参数的同时添加新参数,才需要用到QSA(Query String Append)标记,示例:
RewriteRule "^$" "/en/home.html?lang=en" [PT,QSA]
此时访问www.oursite.com?affiliate=123会被重写到/en/home.html?lang=en&affiliate=123,原始参数依然保留。
错误写法说明
你提到的RewriteRule "^$" "/pt/home.html?{$QUERYPARMS}" [PT]是错误的:
- Apache的查询字符串变量是
%{QUERY_STRING},而非{$QUERYPARMS} - 手动拼接会导致原始参数为空时,目标URL多出不必要的问号(如
/en/home.html?)
内容的提问来源于stack exchange,提问作者John Little
相关产品推荐
相关产品推荐

