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