如何将URL查询字符串重写为哈希?全站通用重写方案求助
嘿,我来帮你搞定这个URL重写的问题!把查询字符串转成URL哈希值(就是#后面的部分),同时让规则适配全站所有URL,核心是利用服务器的重写模块做定向处理,还要避免循环重定向的坑。下面分两种最常用的服务器环境给你具体方案:
Apache 配置方案
首先得确保你的Apache已经启用了mod_rewrite模块,然后在网站根目录的.htaccess文件或者服务器的httpd.conf配置里添加以下规则:
RewriteEngine On # 仅当存在查询字符串、且当前URL还没有哈希值时触发重写 RewriteCond %{QUERY_STRING} .+ RewriteCond %{REQUEST_URI} !# RewriteRule ^(.*)$ /$1#%{QUERY_STRING}? [R=302,L]
给你拆解下每一行的作用:
RewriteEngine On:开启Apache的重写引擎,这是所有重写规则的前提RewriteCond %{QUERY_STRING} .+:检查当前URL是否带有非空的查询字符串(比如?id=123这种)RewriteCond %{REQUEST_URI} !#:确保当前URL里还没有#哈希标识,防止重定向后再次触发规则,造成循环RewriteRule ^(.*)$ /$1#%{QUERY_STRING}? [R=302,L]:捕获当前URL的路径部分,重定向到「原路径+#+原查询字符串」的格式,末尾的?是用来清空原查询字符串的;R=302表示临时重定向,测试没问题后可以换成R=301做永久重定向;L表示这是最后一条规则,匹配后就停止后续规则处理
Nginx 配置方案
如果你的网站用的是Nginx,直接在对应的server配置块里添加以下规则即可:
if ($query_string != "") { rewrite ^(.*)$ $1#$query_string? permanent; }
简单解释下:
if ($query_string != ""):判断当前URL是否带有非空的查询字符串rewrite ^(.*)$ $1#$query_string? permanent;:捕获原URL的路径部分,重定向到「原路径+#+原查询字符串」的格式,末尾的?清空原查询字符串;permanent是301永久重定向,要是想临时测试可以换成redirect(对应302临时重定向)
注意事项
- 要知道URL的哈希部分(
#后面的内容)是客户端浏览器处理的,服务器不会接收到这部分内容,所以重定向后服务器不会再解析哈希里的参数,这是正常的浏览器行为 - 建议先用302临时重定向测试规则是否生效,确认没问题后再换成301永久重定向,避免搜索引擎缓存错误的重定向规则
- 如果你的网站还有其他重写规则,要注意规则的顺序,把这条哈希重写的规则放在靠前的位置,避免被其他规则拦截
内容的提问来源于stack exchange,提问作者Blueboye
相关产品推荐
相关产品推荐

