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


How to generate url redirects similar to stackoverflow using .htaccess and php?

背景

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

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

上面的url有一个问题id:1039725问题标题是:如何在php中进行url重写

只是为了玩这个url,即使在标题部分输入一些垃圾内容,只要问题id在那里,就会显示相同的问题内容。例如,下面的url也将提供相同的内容。

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

更多url栏自动更改为:

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

我的问题

我知道stackoverflow可能会使用.htaccess将所有带有问题id的url重定向到某个后端(比如php页面)进行处理。但是地址栏是如何自动更改为实际问题标题的呢?

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

这个想法是为了避免为每个问题创建不必要的网络文件夹,只是为了重定向。

它没有你想象的那么神奇。每个帖子在存储它的数据库中都有一个相关的鼻涕虫(或者鼻涕虫是动态生成的,这无关紧要)。不过,从数据库中检索时,只有数字id才是真正重要的。之后是一个简单的检查(伪代码):

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

没有更多,没有更少。

这只是为了SEO目的,所以URL总是以当前形式包含问题的标题,并保持该URL的规范性。

您可以使用简单的php代码来完成此操作

检查代码

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

这是您可以用于此的逻辑