.htaccess规则部分失效,双博客URL重写问题求助
修复双博客的.htaccess RewriteRule问题
嘿,我来帮你搞定这个问题!看起来你是想给站点里的两个独立博客实现带标题别名的伪静态URL,但对应ss-viewpost.php的规则没生效对吧?大概率是规则冲突或者匹配逻辑的问题,咱们一步步来解决:
先明确核心需求
你需要两个不同的URL模式,分别对应两个PHP文件:
- 第一个博客:
/tms/post/123-my-first-post→ 映射到viewpost.php?id=123 - 第二个博客:
/tms/ss-post/456-my-second-post→ 映射到ss-viewpost.php?id=456
标题别名(slug)只是用来优化SEO和URL可读性,后端只需要文章ID就能从对应数据表取数据,所以我们不需要把slug传递给PHP文件。
修复后的完整.htaccess规则
把下面的规则替换/补充到你的现有配置里,注意规则顺序很重要:
RewriteEngine On RewriteBase /tms/ # 第一个博客:匹配带前缀post/的URL,提取文章ID RewriteRule ^post/(\d+)-.*$ viewpost.php?id=$1 [L] # 第二个博客:匹配带前缀ss-post/的URL,提取文章ID RewriteRule ^ss-post/(\d+)-.*$ ss-viewpost.php?id=$1 [L] # 你原来的分类和归档规则(保持不变) RewriteRule ^c-(.*)$ catpost.php?id=$1 [L] RewriteRule ^a-(.*)-(.*)$ archives.php?month=$1&year=$2 [L]
关键修复点解释
用URL前缀区分两个博客:
给两个博客的URL加上不同的前缀(post/和ss-post/),避免规则互相干扰——如果之前你没加前缀,直接写匹配数字+slug的规则,第一个规则会把所有类似123-xxx的URL都拦截,导致第二个规则永远不会触发。精准匹配文章ID:
用(\d+)只匹配数字格式的文章ID,比(.*)更精准,避免误匹配其他带横杠的URL。后面的.*用来匹配任意标题别名,不管slug是什么都不影响ID的传递。规则顺序兼容性:
因为我们的博客规则有明确前缀,和你原来的c-、a-前缀完全不冲突,所以规则顺序不会影响原有功能的正常运行。
测试验证
- 访问
http://你的域名/tms/post/123-test-title,应该能正常加载viewpost.php?id=123的内容 - 访问
http://你的域名/tms/ss-post/456-ss-test-title,应该能正常加载ss-viewpost.php?id=456的内容 - 原来的分类URL(比如
/tms/c-1)和归档URL(/tms/a-10-2024)依然正常工作
内容的提问来源于stack exchange,提问作者Salman Ahmed
相关产品推荐
相关产品推荐

