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

网站作品集页面Slug路由异常求助:.htaccess配置导致404问题

解决作品集页面Slug URL路由问题

你的核心问题在于当前的.htaccess规则是"一网打尽"式的,所有非文件/目录的请求都被转到了single.php,导致作品集的Slug请求无法正确路由到portfolio-single.php,进而触发404错误。下面是分步解决方案:

1. 调整.htaccess路由规则,区分博客与作品集请求

给作品集的URL添加专属前缀(比如/portfolio/),并把作品集的路由规则放在博客规则之前(因为RewriteRule是按顺序匹配的)。修改后的.htaccess代码如下:

Options +MultiViews
RewriteEngine on
RewriteBase /

# 优先匹配作品集请求:所有以/portfolio/开头的非文件/目录请求
RewriteCond %{REQUEST_FILENAME} !-d [NC]
RewriteCond %{REQUEST_FILENAME} !-f [NC]
RewriteCond %{REQUEST_FILENAME} !-l [NC]
RewriteRule ^portfolio/(.*)$ portfolio-single.php?page=$1 [QSA,L]

# 剩下的请求交给博客文章处理
RewriteCond %{REQUEST_FILENAME} !-d [NC]
RewriteCond %{REQUEST_FILENAME} !-f [NC]
RewriteCond %{REQUEST_FILENAME} !-l [NC]
RewriteRule ^(.*)$ single.php?id=$1 [QSA,L]

ErrorDocument 404 /404-error.php

调整后,访问/portfolio/your-project-slug会被正确转发到portfolio-single.php?page=your-project-slug,而博客文章请求(比如/your-blog-post)依然会正常路由到single.php。

2. 修复后端代码的参数处理逻辑

你在portfolio-single.php中使用了Post::getPostById($conn, $_GET['page']),这里存在两个潜在问题:

  • 方法名getPostById暗示它是根据数字ID查询,但你传入的是Slug字符串,这会导致数据库查询不到数据,最终表现为页面空白或404。
  • 没有处理"查询不到作品集条目"的情况,即使路由正确,也可能因为无数据而显示错误。

建议修改代码如下:

if(empty($_GET['page'])) {
    Url::Redirect("/");
} else {
    // 替换为适合作品集的查询方法(比如按Slug查询)
    $portfolio = Portfolio::getPortfolioBySlug($conn, $_GET['page']);
    
    // 如果未找到对应条目,返回404
    if(!$portfolio) {
        header("HTTP/1.0 404 Not Found");
        include('404-error.php');
        exit;
    }
}

如果没有单独的Portfolio类,也可以调整Post类的方法,比如新增getPostBySlug,并确保查询条件匹配数据库中的slug字段(而非id字段)。

3. 验证MultiViews设置

你的.htaccess中开启了Options +MultiViews,这个设置可能会影响URL解析(比如自动匹配文件扩展名)。如果调整路由后仍有问题,可以尝试暂时注释掉这一行,测试是否能正常工作。


内容的提问来源于stack exchange,提问作者Donald Philip

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:27:10