.htaccess多参数重写异常:页面链接与资源引用路径错误
解决URL重写后的路径问题
问题1:静态资源(JS、CSS、图片)引用路径错误
这是因为页面用相对路径引用资源时,浏览器会以当前URL的层级为基准解析路径。比如在/MyCategory/MySubcategory/页面里,css/style.css会被解析成/MyCategory/MySubcategory/css/style.css,而非根目录的/css/style.css。
解决办法二选一:
- 方案1(推荐):添加base标签
在HTML页面的<head>中插入:
<base href="/">
这条标签会强制所有相对路径以网站根目录为基准解析,不用逐个修改资源链接。
- 方案2:改用绝对路径
给所有资源的相对路径前加斜杠,比如:- 把
js/main.js改成/js/main.js - 把
images/logo.png改成/images/logo.png
- 把
问题2:页面内其他链接(如newlink.html)路径错误
在三级URL页面点击newlink.html时,浏览器会请求/MyCategory/MySubcategory/MyProduct/newlink.html,你的重写规则会把这个路径匹配为principal.php?cat=MyCategory&sub=MySubcategory&prod=MyProduct,导致跳转错误。
解决思路:
- 优先用绝对路径写页面内链接
把页面里的newlink.html改成/newlink.html,直接指向根目录的文件,从根源避免路径解析错误。 - 优化.htaccess规则,排除静态文件和特定路径
调整重写规则,先放行真实存在的文件/目录,再执行URL重写:
修改后的.htaccess代码:
RewriteEngine on # 直接放行真实存在的文件、目录,以及常见静态资源后缀 RewriteCond %{REQUEST_FILENAME} -f [OR] RewriteCond %{REQUEST_FILENAME} -d [OR] RewriteCond %{REQUEST_URI} \.(html|css|js|png|jpg|gif|ico|txt)$ [NC] RewriteRule ^ - [L] # 一级URL重写 RewriteRule ^([^/]+)$ principal.php?cat=$1 [L] # 二级URL重写 RewriteRule ^([^/]+)/([^/]+)$ principal.php?cat=$1&sub=$2 [L] # 三级URL重写 RewriteRule ^([^/]+)/([^/]+)/([^/]+)$ principal.php?cat=$1&sub=$2&prod=$3 [L]
为什么之前的RewriteCond %{REQUEST_URI} !^/newlink\.html$无效?
因为你要排除的请求是/MyCategory/newlink.html,而非/newlink.html,所以这条条件不匹配。如果要单独处理这个链接,可以在重写规则前添加:
RewriteRule ^[^/]+/newlink\.html$ /newlink.html [L,R=301]
这条规则会把所有层级下的newlink.html重定向到根目录的对应文件,但更通用的方案还是用绝对路径写页面链接。
内容的提问来源于stack exchange,提问作者Jam
相关产品推荐
相关产品推荐

