堆栈溢出URL如何工作?

问题描述:

我已经构建了我的网站的网址,例如堆栈 溢出网址。我的网址如下。堆栈溢出URL如何工作?

http://www.example.com/1255544/this-is-the-url-text 

在这个URL,1255544是id和this-is-the-url-text是URL标题文本,无论是存储在数据库中。我注意到,堆栈 溢出URL在id的基础上工作。假设这里是一个堆栈溢出  URL

http://*.com/questions/15679171/new-way-to-prevent-xss-attacks 

在这个URL,15679171是帖子的ID。当我改变了这个ID来15706581而不触及new-way-to-prevent-xss-attacks并按下Enter键,网址自动更改为以下网址:

http://*.com/questions/15706581/simplecursoradapter-does-not-load- 
external-sqlite-database-id-error 

,当我试图删除一些URL标题文本的部分像下面

http://*.com/questions/15679171/new-way-to-preve 

它自动校正,如下的URL:

http://*.com/questions/15679171/new-way-to-prevent-xss-attacks 

这意味着数据被从数据库中检索根据id为15679171以及相关的URL标题文本new-way-to-prevent-xss-attacks

我也想这样做。但问题是,我不明白如果有人更改URL的标识,标题文本应该自动更改。我该怎么做呢?

我已经想好了以下内容:

$url_id = $_GET["id"]; 
$url_txt = $_GET["url_txt"]; 

$qry = "SELECT * FROM mytable WHERE url_id = '{$url_id}' LIMIT 1"; 
$data = mysql_query($qry); 
$data_set = mysql_fetch_array($data); 

if($url_txt== $data_set["url_txt"]) { 
    // proceed further 
} else { 
    $rebuilt_url = "http://www.example.com/" . $url_id . "/" . $data_set["url_txt"]; 
    header("Location: {$rebuilt_url}") // Redirect to this URL 
} 

是否执行此操作或不正确的和有效的方式?有解决方案吗?

+1

当页面加载,从您的数据库通过id来获取URL,它的URL从地址栏比较,如果它是不一样的,然后重定向到正确的URL。 – 2013-04-06 04:54:48

+0

另外,小心sql注入(铸造$ url_id到一个int应该做的伎俩)。 – 2013-04-06 05:04:44

+0

你好。您最近发布了一个名为“如何*问题解答系统工作”的问题,并由主持人将其迁移到错误的其他站点。哎呀,为他们拍了':)'。我建议你重新发布它(使用复制和粘贴!),但称它为“如何优化我的类似*的系统”。请记住,尽管您可能会在评论中发表一些一般性评论,但它可能会因为太过松散而被封闭。如果你转发,请在这里(@halfer)给我打电话,我会发表评论。 – halfer 2013-04-07 19:11:13

如果使用Apache,我想你一定知道URL rewriting

在URL重写你的URL改写为一个更友好的样子。看看下面的网址

http://www.downloadsite.com?category=34769845698752354

,当你在上面做一个URL重写,变成这个样子

http://www.downloadsite.com/Nettools/Messengers 

URL重写需要在Apache的设置配置(重写规则),以便在PHP解释请求之前重写您的URL,这样您将获得想要获取的确切资源

RewriteRule ^/category$ /content.php 
    RewriteRule ^/category/([0-9]+)$ /.php?id=$1 
    RewriteRule 
    ^/category/([0-9]+),([ad]*),([0-9]{0,3}),([0-9]*),([0-9]*$) 
    cat.php?id=$1&sort=$2&order=$3&start=$4 

嗯,我不能在这里解释你的一切,但下面我提供了一些链接,你可以在这里了解URL重写。

这是您可以创建友好网址的最佳方法!

资源:

+3

嗨Mahan,Stack Overflow的习惯是在你的答案本身提供一个例子或解释。这确保了三件事情:如果链接中断,您的答案对未来的访问者仍然有价值,并且它确保人们只需要在堆栈溢出时留下更深入的信息,而不会回答问题的答案。最后,你的例子可以定制,而链接可能是泛化。您可以使用此[编辑]链接进行添加。希望这可以帮助。 – jmort253 2013-04-06 04:58:02

+0

好吧,URL重写有很多方法,每种方法都有很长的路要走,所以我只是把我在网上找到的一些最好的链接。那么我会编辑我的答案 – 2013-04-06 05:02:20

+3

你不必显示*每个*的可能性,但一个例子会阻止你的帖子被标记为不是答案。此外,示例有助于人们学习并增加您的帖子获得更多优惠的机会。祝你好运! :) – jmort253 2013-04-06 05:05:29

你的代码看起来不错,在我的一个堆栈 溢出答案我也建议类似的方法。不过,我只提出一点小改进。相反的:

header("Location: {$rebuilt_url}"); 

你应该这样做:

header ('HTTP/1.1 301 Moved Permanently'); 
header("Location: {$rebuilt_url}"); 

这将让浏览器缓存这些URL积极,每次你的代码和SQL查询将不会被执行。

同时检查:

  1. .htaccess if URL is bad do something
  2. .htaccess rewrite friendly URLs