如何在.htaccess中实现含问号参数的URL强制重定向?
解决含问号参数的URL重定向问题
这个问题的核心在于Apache的RewriteRule默认只匹配请求的路径部分(也就是?之前的内容),而?后面的查询字符串不会被包含在$1捕获组里。当你的ArgumentValue包含问号时,浏览器会自动把?后面的内容当作查询字符串处理,导致原规则丢失这部分关键信息。
修正后的重写规则
你可以通过结合查询字符串变量和NE(NoEscape)标志来解决这个问题,确保所有动态参数(包括含问号的部分)都能正确传递:
RewriteCond %{SCRIPT_FILENAME} !-d RewriteCond %{SCRIPT_FILENAME} !-f RewriteRule (.*)$ ./apex/f?p=alias:$1%{QUERY_STRING:+?%{QUERY_STRING}} [L,NE]
规则详解
%{QUERY_STRING}:Apache提供的变量,用于获取请求中?后面的所有查询字符串内容%{QUERY_STRING:+?%{QUERY_STRING}}:这是一个条件拼接语法——只有当查询字符串不为空时,才会添加?和对应的查询字符串,避免目标URL出现多余的空?NE标志:全称NoEscape,作用是阻止Apache对?、=等特殊字符进行URL编码,确保这些字符原样传递到目标的f?p=参数中[L]标志:表示这是最后一条规则,匹配后不再执行后续重写规则
更健壮的替代方案
如果你希望确保捕获完整的请求路径(包括开头的/之外的所有内容),也可以使用%{REQUEST_URI}变量来替代捕获组,这样能避免因路径格式差异导致的问题:
RewriteCond %{SCRIPT_FILENAME} !-d RewriteCond %{SCRIPT_FILENAME} !-f RewriteRule ^ ./apex/f?p=alias:%{REQUEST_URI:1}%{QUERY_STRING:+?%{QUERY_STRING}} [L,NE]
这里的%{REQUEST_URI:1}表示取REQUEST_URI变量从第2个字符开始的内容(去掉开头的/),确保传递的路径格式和原请求一致。
测试场景验证
- 无问号的URL:
www.domain.com/PageName:Arg1,Arg2→ 重定向到www.domain.com/apex/f?p=alias:PageName:Arg1,Arg2(正常工作) - 含问号的参数URL:
www.domain.com/PageName:Arg?1,Arg2→ 重定向到www.domain.com/apex/f?p=alias:PageName:Arg?1,Arg2(问号被正确保留) - 混合路径和查询字符串的URL:
www.domain.com/PageName:Arg?1,Arg2&foo=bar→ 重定向到www.domain.com/apex/f?p=alias:PageName:Arg?1,Arg2&foo=bar(所有参数完整传递)
内容的提问来源于stack exchange,提问作者Thomas Carlton
相关产品推荐
相关产品推荐

