如何使用.htaccess创建重写规则实现友好URL与链接重定向
搞定.htaccess友好URL重写的完整方案
我来帮你把那个带一堆参数和特殊字符的动态URL转换成干净的友好链接,分两步走:先把旧URL重定向到新的友好格式,再让服务器能识别友好URL并转发到原PHP文件处理。
第一步:把旧动态URL重定向到友好URL(永久301重定向)
首先要让用户访问旧的view.php?idp=xxx...时,自动跳转到干净的URL,同时把括号、冒号这些特殊字符都换成连字符,去掉多余的斜杠。把下面的规则放到你的.htaccess里(可以替换掉你现有的规则):
RewriteEngine On RewriteBase /piratefiles/ # 循环替换特殊字符:括号、冒号、下划线、空格都换成连字符 RewriteCond %{QUERY_STRING} ^(.*?)([\(\):_\s])(.*)$ RewriteRule ^view\.php$ %{REQUEST_URI}?%1-%3 [N,NE] # 去掉查询参数末尾的斜杠(如果有的话) RewriteCond %{QUERY_STRING} ^(.*)/$ RewriteRule ^view\.php$ %{REQUEST_URI}?%1 [L,NE] # 重定向到带标题的友好URL:比如 /view/2/in-this-corner-of-the-world-kono-sekai-no-katasumi-ni RewriteCond %{QUERY_STRING} ^idp=(\d+)&cat=[^&]+&pst=([^&]+)$ RewriteRule ^view\.php$ view/%1/%2/? [L,R=301,NE] # 如果你只想保留极简的ID版本(比如 /view/2/),就把上面3行替换成下面这两行: # RewriteCond %{QUERY_STRING} ^idp=(\d+)&.*$ # RewriteRule ^view\.php$ view/%1/? [L,R=301,NE]
第二步:让友好URL能被服务器正确处理(内部重写)
现在需要让服务器知道,当用户访问友好URL时,要偷偷转发到view.php处理,用户看不到这个过程:
# 对应带标题的友好URL,内部转发到view.php RewriteRule ^view/(\d+)/([^/]+)/?$ view.php?idp=$1&pst=$2 [L,QSA] # 如果你用的是极简ID版本,就替换成这条: # RewriteRule ^view/(\d+)/?$ view.php?idp=$1 [L,QSA]
几个关键细节要注意:
- RewriteBase:我设置成了
/piratefiles/,因为你的项目在这个子目录下,确保规则的路径不会出错。 - 301重定向:用
R=301而不是302,这是永久重定向,对SEO友好,也避免浏览器缓存临时重定向的问题。 - 特殊字符扩展:如果你的
pst参数里还有其他特殊字符(比如感叹号、@之类的),可以在[\(\):_\s]里加上对应的字符,比如改成[\(\):_\s!@#]。 - QSA标志:这个标志会把额外的查询参数(比如原URL里的
cat)自动附加到内部请求里,确保你的业务逻辑能正常拿到所有参数。
测试小提示:
- 先确认Apache的
mod_rewrite模块已经开启,不然规则不会生效。 - 测试前记得清空浏览器缓存,因为301重定向会被浏览器缓存下来,可能影响测试结果。
- 可以先暂时用
R=302测试,确认没问题再改成R=301。
内容的提问来源于stack exchange,提问作者ainodoramaaa 2
相关产品推荐
相关产品推荐

