PHP项目通过htaccess配置友好URL的重写规则是否可行
你编写的这套重写规则无法满足你的需求,核心问题有2个:
- 规则匹配逻辑和你预期的URL结构不匹配:你期望的是
/student?id=21、/book?id=88这类将id放在查询参数里的格式,但你写的规则匹配的是/student/数字、/book/数字这类路径分段传参的格式,完全对不上你的目标结构。 - 缺少必要的重写标志:你没有加
L和QSA标志,就算路径匹配成功,原URL携带的查询参数也不会自动传递到重写后的地址,还可能出现后续规则覆盖当前匹配结果的问题。
正确可生效的配置如下
首先确保你的Apache已经开启mod_rewrite扩展,.htaccess文件开头先加一行开启重写引擎:
RewriteEngine On
然后替换你的规则为以下内容即可匹配你要的URL结构:
# 匹配 /teacher RewriteRule ^teacher$ index.php?view=1 [L,QSA] # 匹配 /student 自动透传?id=xx参数 RewriteRule ^student$ index.php?view=2 [L,QSA] # 匹配 /book 自动透传?id=xx参数 RewriteRule ^book$ index.php?view=3 [L,QSA]
标志说明:
L:表示当前规则匹配成功后就停止执行后续的重写规则,避免逻辑冲突QSA:自动将原URL携带的查询参数(比如?id=21)附加到重写后的目标地址后,不需要手动捕获参数,刚好匹配你的需求。
如果你需要同时兼容路径传参(也就是/student/21和/student?id=21都可以访问),可以用下面的兼容版规则:
RewriteEngine On RewriteRule ^teacher$ index.php?view=1 [L,QSA] RewriteRule ^student(?:/(\d+))?$ index.php?view=2&id=$1 [L,QSA] RewriteRule ^book(?:/(\d+))?$ index.php?view=3&id=$1 [L,QSA]
内容的提问来源于stack exchange,提问作者JohnP
相关产品推荐
相关产品推荐

