.htaccess重写规则顺序错误,如何让自定义规则优先执行?
嘿,我来帮你捋清楚这个问题——首先得纠正你一个关键误解:Apache的Rewrite规则不是从下往上执行的,而是从上到下按顺序匹配的!一旦某个规则匹配成功并触发(带L标记的话会直接停止后续处理),后面的规则就没机会执行了。这就是为啥你把自定义规则放底部时,会先被Joomla的规则截胡的原因。
具体解决步骤
把自定义重定向规则移到.htaccess最顶部
直接把你的重定向规则放在整个.htaccess文件的最开头,确保它在Joomla那些安全拦截规则(就是你贴的那段检查恶意Query String的规则)之前被处理。修正规则里的路径匹配(可能的笔误)
看你给出的旧链接是http://www.suzukiclubuk.co.uk/forum/viewtopic.php?p=113363,但你测试的规则里写的是^forum1/(.*)$,这里应该是打错了吧?得改成匹配^forum/(.*)$才能正确对应旧路径。调整后的完整规则如下:RewriteEngine On RewriteCond %{HTTP_HOST} ^(www\.)?suzukiclubuk\.co.uk$ RewriteRule ^forum/(.*)$ http://forum.suzukiclubuk.co.uk/$1 [L,R=301][L]标记很重要:它告诉Apache,这条规则匹配成功后就停止处理后面的所有规则,直接返回重定向响应。R=301是永久重定向,对SEO友好;测试阶段可以先用R=302临时重定向,避免浏览器缓存错误的结果。
为什么这样就生效了?
当请求进来时,Apache会先检查最顶部的自定义规则:如果是/forum/开头的路径,直接触发重定向,并且因为L标记,不会再往下执行Joomla的那些规则,自然就不会被拦截了。
补充说明
之前你把规则放底部,Apache会先从上到下执行Joomla的安全规则——那段规则里的RewriteRule .* index.php [F]是匹配所有路径的,只要请求的Query String没触发拦截条件,也会被导向index.php,你的自定义规则根本没机会被执行到。
最后提醒下:确保服务器开启了mod_rewrite模块,.htaccess文件也有足够的读取权限哦。
内容的提问来源于stack exchange,提问作者Tim Wilkinson

