.htaccess中如何去除URL内多余%20并修复链接错误?
.htaccess中如何去除URL内多余%20并修复链接错误?
嘿,我来帮你搞定这个URL里%20导致的规则匹配问题!
首先得搞明白问题出在哪:你的Rewrite规则是靠下划线_来分割参数的,但URL里的Higher%20education其实是空格的URL编码形式,这部分里的空格(或者说%20)会打断原本的下划线匹配逻辑,导致规则没法正确捕获q参数,自然就报错了。
给你两个简单的解决思路,优先推荐第一种,不用动你现有的业务规则:
方案一:先把空格(%20)替换成下划线
咱们在现有规则前面加一条预处理规则,把URL里所有的空格(不管是实际空格还是编码后的%20)都替换成下划线,这样就能让你的原有规则正常工作了。
修改后的完整.htaccess代码如下:
#Options +FollowSymLinks Options -Indexes RewriteEngine On # 预处理:循环替换URL中的空格(含编码后的%20)为下划线,直到没有空格为止 RewriteRule ^([^ %20]*)[ %20]+(.*)$ $1_$2 [N,L] # 原有规则保持不变 RewriteRule (.*)_hello_(.*)_lan_(.*)_html.html$ view_html.php?q=$1&sq=$2&lang=$3 [B,L] RewriteRule (.*)_hello_(.*)_lan_(.*)_plain.html$ view_plain.php?q=$1&sq=$2&lang=$3 [B,L]
解释下这条预处理规则:
[^ %20]*:匹配所有不是空格或%20的字符[ %20]+:匹配一个或多个连续的空格(包括编码后的%20)$1_$2:把匹配到的空格替换成下划线[N]标志:让规则循环执行,直到URL里再也找不到空格为止[L]标志:当前规则匹配后,暂停后续规则,等下一轮循环再处理
这样你测试的那个URL http://example.com/Higher%20education_wikipedia_EDUCATIONS_lan_en_html.html,会先被转成http://example.com/Higher_education_wikipedia_EDUCATIONS_lan_en_html.html,然后就能被你原来的规则正确捕获参数啦。
方案二:修改现有规则适配空格
如果不想替换下划线,也可以直接修改原有规则,让它能匹配包含空格(%20)的部分,把规则里的(.*)改成([^_]+)(匹配到下一个下划线之前的所有字符,包括空格),比如:
RewriteRule ([^_]+)_hello_([^_]+)_lan_([^_]+)_html.html$ view_html.php?q=$1&sq=$2&lang=$3 [B,L]
不过这个方法需要确保你的参数里确实不会出现下划线,否则会匹配出错,所以还是方案一更稳妥。
备注:内容来源于stack exchange,提问作者Michael Tandiono
相关产品推荐
相关产品推荐

