背景
正如人们在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');
}
这是您可以用于此的逻辑