RewriteRule匹配video/路径时生成空$_GET['id']参数如何解决
Apache mod_rewrite 重写时空ID参数问题修复
问题原因
现有第二条重写规则的捕获组使用[^/]*匹配规则,*限定符代表匹配0次或多次非斜杠字符,因此访问video/路径时,捕获组会匹配到空字符串,自动在查询字符串追加id=,最终PHP端$_GET['id']被赋值为空字符串,导致isset()判断返回true。
修正后的重写规则
直接调整匹配规则的限定符,单独覆盖无ID的带斜杠路径即可,完整规则如下:
RewriteRule ^video/?$ video.php [L] RewriteRule ^video/([^/]+)/?$ video.php?id=$1 [QSA,NC,L]
改动说明
- 第一条规则调整为
^video/?$,可同时匹配无ID的/video和/video/路径,两种场景都不会自动追加id查询参数,PHP端不会默认生成$_GET['id']变量 - 第二条规则将捕获组的
*限定符替换为+,要求斜杠后必须存在至少1个字符才会触发匹配,仅当路径显式携带ID(如/video/5)时,才会将捕获内容赋值给id参数 - 保留
QSA标记,URL显式传递的参数会被正常保留:比如访问/video/5?source=index时source参数不会丢失,访问/video/?id=2时手动传递的id参数也会正常被PHP识别,完全符合预期。
效果验证
对应不同访问路径的运行结果:
- 访问
/video:进入video.php,不存在$_GET['id'] - 访问
/video/:进入video.php,不存在$_GET['id'] - 访问
/video/5:进入video.php,$_GET['id']值为"5" - 访问
/video/5?type=flv:进入video.php,$_GET['id']值为"5",$_GET['type']值为"flv" - 访问
/video/?id=8:进入video.php,$_GET['id']值为"8"(URL显式传参正常生效)
内容的提问来源于stack exchange,提问作者provance
相关产品推荐
相关产品推荐

