.htaccess分页URL重定向后页面资源路径异常求助
问题分析与解决方案
核心问题
浏览器访问/blog/page/1这类URL时,会默认认为当前所在目录是/blog/page/,页面中用相对路径引用的资源(如style.css、images/logo.png)会被解析为/blog/page/style.css,但实际资源文件并不在这个虚构的目录下,导致路径错误。
另外你原配置中的前两条规则存在写法错误:RewriteRule仅匹配URL的路径部分,不包含?及后面的查询字符串,所以^blog/\?page=([0-9]+)$这种写法永远匹配不到,反而可能引发规则冲突导致503错误。
修正后的.htaccess配置
RewriteEngine On # 1. 重定向旧URL(?page=xxx)到新URL(/page/xxx),避免重复内容 # 处理博客首页分页 RewriteCond %{QUERY_STRING} ^page=([0-9]+)$ RewriteRule ^blog/$ /blog/page/%1? [R=301,L] # 处理分类页分页 RewriteCond %{QUERY_STRING} ^page=([0-9]+)$ RewriteRule ^blog/category/([^/]+)/$ /blog/category/$1/page/%1? [R=301,L] # 2. 内部重写新URL到原格式,供PHP程序处理 # 博客首页分页重写 RewriteRule ^blog/page/([0-9]+)$ /blog/?page=$1 [L] # 分类页分页重写 RewriteRule ^blog/category/([^/]+)/page/([0-9]+)$ /blog/category/$1/?page=$2 [L] # 3. 修复资源路径:将虚构目录下的资源请求重定向到实际目录 # 处理博客首页分页下的资源 RewriteCond %{REQUEST_URI} ^/blog/page/[^/]+$ RewriteRule ^blog/page/([^/]+)$ /blog/$1 [L] # 处理分类页分页下的资源 RewriteCond %{REQUEST_URI} ^/blog/category/[^/]+/page/[^/]+$ RewriteRule ^blog/category/([^/]+)/page/([^/]+)$ /blog/category/$1/$2 [L]
配置说明
- 重定向规则:用
RewriteCond匹配查询字符串中的page参数,将旧URL永久重定向(R=301)到新URL,末尾的?用于清除原查询字符串,避免URL出现/blog/page/1?page=1的异常情况。 - 内部重写规则:将新格式的URL转换为PHP程序能识别的带
?page=的格式,[L]标记表示这是最后一条规则,避免后续规则干扰解析逻辑。 - 资源修复规则:当浏览器请求
/blog/page/style.css这类不存在的路径时,自动重写到/blog/style.css;分类页同理,确保所有静态资源能正确加载。
额外建议
如果可以修改PHP代码,推荐直接在页面的<head>中添加<base>标签,指定页面的基准URL,从根源解决相对路径问题:
<base href="/blog/">
这样所有相对路径都会以/blog/为基准解析,无需依赖.htaccess的资源重写规则,更简洁可靠。
内容的提问来源于stack exchange,提问作者Sheldon C
相关产品推荐
相关产品推荐

