如何实现友好URL且不破坏图片、CSS、JavaScript等静态资源加载?
实现方案选择
优先用 .htaccess 实现伪静态跳转,相比PHP实现的优势是不需要侵入业务代码,服务器层面直接处理请求性能更高,也更符合SEO友好的URL规范。
静态资源加载失效的原因
你遇到的问题是两个原因共同导致的:
- 现有重写规则没有排除真实存在的静态资源请求,所有匹配
blog/开头的请求都会被转发到blog.php,包括静态资源 - 页面内静态资源用的是相对路径,当URL变成
blog/Blizzard层级后,浏览器会把相对路径解析为blog/目录下的资源路径,和实际资源存储路径不符
完整修复方案
步骤1:修改.htaccess重写规则
替换你现有的规则为以下完整配置:
RewriteEngine On # 跳过真实存在的文件请求 RewriteCond %{REQUEST_FILENAME} !-f # 跳过真实存在的目录请求 RewriteCond %{REQUEST_FILENAME} !-d # 跳过真实存在的软链接请求 RewriteCond %{REQUEST_FILENAME} !-l # 重写blog/开头的路径到blog.php,L表示终止后续规则匹配,QSA表示保留原有查询参数 RewriteRule ^blog/(.*)$ blog.php?id=$1 [L,QSA]
步骤2:修复静态资源路径,二选一即可
- 方案A:给所有静态资源路径加站点根目录前缀,比如把
src="img/cover.jpg"改为src="/img/cover.jpg",绝对路径不会受当前页面URL层级影响 - 方案B:在页面
<head>标签内添加base标签,全局指定相对路径的基准目录,不需要逐个修改资源引用:
<base href="/">
内容的提问来源于stack exchange,提问作者pooya
相关产品推荐
相关产品推荐

