网站作品集页面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
相关产品推荐
相关产品推荐

