PHP配置.htaccess重写URL后无法正确获取GET参数如何解决
问题原因
1. 重写规则正则匹配逻辑错误
你当前使用的.*是贪婪匹配规则,会匹配包含斜杠/在内的任意字符,分组时会优先吞掉尽可能多的路径内容,最终导致参数拆分错位:
比如实际访问路径为/news/1114/Presentation: Heath+Day+in+2018/时,第一个(.*)会匹配到news/1114赋值给newstype,第二个(.*)匹配到标题内容赋值给newsid,第三个分组无有效内容,和你输出的$_GET结果完全吻合。
2. 前端URL生成逻辑错误
生成SEO链接时调用urldecode是完全错误的操作,会导致路径段中的特殊字符(空格、中文、符号等)直接暴露,甚至可能携带额外斜杠破坏路径结构。
修复方案
第一步:修改.htaccess重写规则
将所有贪婪匹配.*替换为[^/]*,限定每个分组仅匹配单个路径段(不包含斜杠):
RewriteEngine On Options +FollowSymlinks RewriteBase / RewriteRule ^([^/]*)/([^/]*)/([^/]*)/?$ news.php?newstype=$1&newsid=$2&newstitle=$3 [L,QSA,NC,B]
第二步:修正前端URL生成逻辑
- 去掉错误的
urldecode调用 - 对每个路径段单独做URL编码,避免特殊字符破坏路径结构
- 给链接加前缀
/强制使用根路径,避免相对路径拼接错误
// 对每个路径段单独处理,newsid转整数进一步保证格式合法 $seoUrl = urlencode($urlNewsType).'/'.intval($newsid).'/'.urlencode($urlNewsTitle).'/'; $seoUrl = html_escape($seoUrl, 'UTF-8'); <a href="/<?php echo $seoUrl; ?>">Read More</a>
内容的提问来源于stack exchange,提问作者user3733831
相关产品推荐
相关产品推荐

