如何使用.htaccess和php生成类似于stackoverflow的url重定向?

时间:2015-02-13 05:18:54

标签: php .htaccess redirect

背景

正如人们在stackoverflow的url结构中注意到的那样,每个问题都有一个id后跟问题标题。例如:

http://stackoverflow.com/questions/1039725/how-to-do-url-re-writing-in-php

上面的网址有问题ID: 1039725 问题标题是:如何在网上重新编写

只是为了玩这个网址,即使有人为标题部分输入一些垃圾内容,只要问题ID存在,就会显示相同的问题内容。例如,以下网址也会提供相同的内容。

http://stackoverflow.com/questions/1039725/some-junk-stuff-title

更加明显,网址栏会自动更改为:

http://stackoverflow.com/questions/1039725/how-to-do-url-re-writing-in-php

我的问题

据我所知,stackoverflow可能使用.htaccess将带有问题id的所有url重定向到某个后端(让我们说php页面)来处理它。但地址栏如何自动更改为实际问题标题?

最重要的是:如何在不重定向到任何真实文件夹的情况下实现显示完整的网址?即我不想在php中使用header()重定向到某个文件夹。

我们的想法是避免为了重定向而为每个问题创建不必要的Web文件夹。

2 个答案:

答案 0 :(得分:1)

它不像你想象的那么神奇。每个帖子都有一个相关的slug在数据库中存储(或者slug是在运行中生成的,它并不重要)。但是,从数据库中检索时,只有数字ID才是真正重要的。之后,这是一个简单的检查(伪代码):

$question = getFromDatabase($_GET['id']);
if ($question['slug'] != $_GET['slug']) {
    header("Location: /questions/$question[id]/$question[slug]", true, 301);
}

没有更多,没有更少。

这仅用于搜索引擎优化目的,因此网址始终包含当前表单中的问题标题,并保持该网址规范。

答案 1 :(得分:0)

你可以用简单的PHP代码

来做到这一点

检查代码

$id=$_GET['id'];
$title=$_GET['title']

$dbposttitle=getfromdb($title)
if($dbposttitle==$title)
{
 /* code here */
}else
{
 header('location:yourdomain/$id/$dbposttitle');
}

这是您可以用于此

的逻辑