如何将含两个查询参数的URL重写为单一目录形式?
解决URL重写问题:将带参数的旧URL转换为统一的/myspace路径
看起来你在URL重写的规则逻辑和语法上踩了几个常见的坑,我来帮你梳理清楚问题所在,再给出正确的实现方式。
先说说你现有规则的核心错误
- 条件逻辑冲突:你写的两个
RewriteCond是“且”的关系,但第一个要求查询字符串完全是id=数字,第二个要求完全是&pseudo=字符——而实际的查询字符串是id=34&pseudo=robin,这两个条件永远不可能同时满足,所以规则根本不会触发。 - 规则方向搞反:你想要把旧的
/login/profil.php?id=xxx&pseudo=xxx转换为/myspace,但你的规则却是匹配/myspace然后跳转到旧URL,完全和需求反向了。 - 转义字符误用:查询字符串里的
&不需要写成&,那是HTML页面里的转义写法,服务器拿到的原始查询字符串是用&分隔参数的。 - 测试规则语法错误:你的测试规则里,目标URL里写了
([0-9]+)这种正则分组——这是错的,正则分组只能放在RewriteRule的匹配模式里,目标里只能用$1、$2这种反向引用。
针对你的需求的正确实现
我分两种常见场景给你方案,你可以根据实际需求选择:
场景1:把旧URL永久重定向到/myspace(地址栏会变化)
如果希望用户访问旧的带参数URL时,自动跳转到新的/myspace(适合SEO和用户体验,地址栏显示统一的路径),用下面的规则:
Options +FollowSymLinks -MultiViews RewriteEngine On # 匹配带id和pseudo参数的旧登录页面,301重定向到/myspace RewriteCond %{QUERY_STRING} ^id=\d+&pseudo=[a-zA-Z0-9]+$ [NC] RewriteRule ^login/profil\.php$ /myspace [R=301,L]
[NC]表示不区分大小写,如果你不需要可以去掉;- 测试阶段建议先用
R=302临时重定向,确认生效后再改成R=301永久重定向(避免浏览器缓存导致测试不生效)。
场景2:用户访问/myspace时,后台加载旧页面内容(地址栏不变)
如果希望用户访问/myspace时,服务器后台实际处理/login/profil.php的内容(比如从用户登录会话中获取id和pseudo,不需要在URL里传递参数),规则如下:
Options +FollowSymLinks -MultiViews RewriteEngine On # 内部重写:把/myspace指向旧的处理脚本 RewriteRule ^myspace$ /login/profil.php [L]
不过这里要注意:如果你的profil.php必须依赖id和pseudo参数才能运行,那这种单路径的/myspace就需要结合用户登录状态来获取参数,不能通过URL重写直接传递——毕竟每个用户的id和pseudo都不一样,不可能用同一个路径对应所有用户。
更合理的扩展:用用户名作为伪静态路径
如果想让每个用户的空间对应/myspace/robin这种更直观的路径,同时内部关联到旧的参数URL,规则可以这么写:
Options +FollowSymLinks -MultiViews RewriteEngine On # 第一步:把旧URL跳转到新的伪静态路径 RewriteCond %{QUERY_STRING} ^id=\d+&pseudo=([a-zA-Z0-9]+)$ [NC] RewriteRule ^login/profil\.php$ /myspace/%1 [R=301,L] # 第二步:把新路径内部重写到旧脚本(通过pseudo查询用户id) RewriteRule ^myspace/([a-zA-Z0-9]+)$ /login/profil.php?pseudo=$1 [L]
这样用户访问旧URL会自动跳转到/myspace/robin,而访问/myspace/robin时,服务器实际加载/login/profil.php?pseudo=robin的内容,你的PHP脚本可以通过pseudo从数据库里查询对应的id。
最后检查配置要点
- 确保你的Apache服务器允许使用
.htaccess:在httpd.conf或虚拟主机配置里设置AllowOverride All; - 测试前清除浏览器缓存,301重定向会被浏览器缓存,可能导致修改后的规则不生效;
- 可以用
RewriteLog(Apache 2.2)或mod_rewrite.c的日志(Apache 2.4+)来调试规则,看具体哪一步出了问题。
内容的提问来源于stack exchange,提问作者Robin
相关产品推荐
相关产品推荐

