如何通过.htaccess实现两类URL分别跳转至detail.php与category.php
问题分析
你的.htaccess规则存在核心逻辑错误:两条RewriteRule的匹配模式完全一致(^([^/_.]+)/?$),且第一条规则带有[L]标志(表示处理完这条规则后终止后续Rewrite流程),导致所有非文件、非目录的请求都会被第一条规则捕获,跳转到detay.php,第二条分类规则永远不会生效。
解决方案
根据你的需求(普通URL跳转到detay.php,分类URL跳转到kategori.php,且sample-category-url这类带-category的URL属于普通URL),最可靠的方式是给分类URL添加统一前缀(比如/kategori/),这样可以在.htaccess中明确区分两类请求:
修改后的.htaccess规则
# 先处理分类URL:匹配以/kategori/开头的请求 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^kategori/([^/_.]+)/?$ kategori.php?category_url=$1 [L,QSA] # 再处理普通URL:匹配所有非文件、非目录的单段URL RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^([^/_.]+)/?$ detay.php?url=$1 [L,QSA]
效果说明
- 分类URL(如
www.domain.com/kategori/sample-category)会跳转到kategori.php?category_url=sample-category - 普通URL(如
www.domain.com/sample-url、www.domain.com/sample-category-url)会跳转到detay.php?url=sample-url和detay.php?url=sample-category-url
若无法修改URL结构的替代方案
如果不能给分类URL加前缀,只能通过后端逻辑判断:将所有请求转发到一个入口文件,在PHP中查询数据库判断当前URL是分类还是普通内容,再跳转对应页面:
.htaccess规则
RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^([^/_.]+)/?$ index.php?url=$1 [L,QSA]
index.php逻辑示例
<?php $requestUrl = $_GET['url'] ?? ''; // 自行实现数据库查询逻辑,判断当前URL是否为分类 function isCategoryUrl($url) { // 示例:查询数据库中是否存在该分类URL // 替换为你的实际查询代码 $pdo = new PDO('mysql:host=localhost;dbname=your_db', 'user', 'pass'); $stmt = $pdo->prepare("SELECT COUNT(*) FROM categories WHERE category_url = ?"); $stmt->execute([$url]); return $stmt->fetchColumn() > 0; } if (isCategoryUrl($requestUrl)) { header("Location: kategori.php?category_url=$requestUrl"); exit; } else { header("Location: detay.php?url=$requestUrl"); exit; } ?>
内容的提问来源于stack exchange,提问作者ilkertncr
相关产品推荐
相关产品推荐

