如何通过.htaccess将/profile/?user={username}转换为友好URL?
解决/profile/?user={username}的友好URL转换问题
嘿,你已经搞定了大部分URL美化的工作,很棒!要处理/profile/?user={username}这种带尾斜杠的请求,只需要在你放在profile目录的.htaccess里添加几条规则就行,分两步处理:
1. 把带查询参数的请求重定向到友好URL(地址栏会更新)
这条规则的作用是,当用户输入http://www.legacycloud.org/profile/?user=xxx时,自动跳转到http://www.legacycloud.org/profile/xxx,让地址栏显示美化后的URL:
# 匹配 ?user=xxx 格式的查询参数,重定向到 ./xxx RewriteCond %{QUERY_STRING} ^user=([^&]+)$ RewriteRule ^$ ./%1? [R=301,L]
RewriteCond %{QUERY_STRING} ^user=([^&]+)$:检查查询字符串是否是user=xxx的形式,[^&]+会捕获用户名(假设用户名不含&符号,如果需要支持可以调整正则)。RewriteRule ^$ ./%1?:匹配当前profile目录下的根路径(也就是/profile/),重定向到./xxx(%1是刚才捕获的用户名),末尾的?用来清空原查询字符串。R=301是永久重定向,对SEO友好;L表示这是最后一条规则,避免后续规则干扰。
2. 确保友好URL能正确映射到index.php
这条规则你可能已经有了,但还是确认一下:它负责把/profile/xxx这种友好URL内部转发到index.php?user=xxx,用户看不到这个过程:
# 把 ./xxx 内部重写到 ./index.php?user=xxx RewriteRule ^([^/]+)$ index.php?user=$1 [L]
^([^/]+)$:匹配profile目录下的任意非斜杠字符(也就是用户名)。index.php?user=$1:把捕获到的用户名作为user参数传递给index.php。
完整的.htaccess代码(放在profile目录下)
RewriteEngine On # 重定向带查询参数的请求到友好URL RewriteCond %{QUERY_STRING} ^user=([^&]+)$ RewriteRule ^$ ./%1? [R=301,L] # 内部处理友好URL RewriteRule ^([^/]+)$ index.php?user=$1 [L]
测试小提示
因为301永久重定向会被浏览器缓存,测试的时候最好用隐私窗口打开,或者先清空浏览器缓存,避免旧的重定向规则干扰结果。如果用户名需要支持特殊字符(比如下划线、点号),[^/]+已经能覆盖,要是有其他需求可以调整正则表达式~
内容的提问来源于stack exchange,提问作者kuchkuch2000
相关产品推荐
相关产品推荐

