You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 02:10:54