4

我是mac用户,从不使用IE。但是昨天在工作中,我遇到了堆栈溢出,并使用 IE 9 将其输入到浏览器中......

http://stackoverflow.com/questions/824349

他们在不刷新页面的情况下替换了 URL...

http://stackoverflow.com/questions/824349/modify-the-url-without-reloading-the-page

我简直不敢相信我所看到的。任何想法堆栈溢出如何能够在不支持它的浏览器上利用模仿历史 API 替换状态的功能?

4

3 回答 3

9

他们实际上是通过重定向来重定向用户301。看标题:

GET /questions/824349 HTTP/1.1
Host: stackoverflow.com
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:21.0) Gecko/20100101 Firefox/21.0
[...]

HTTP/1.1 301 Moved Permanently
Cache-Control: public, max-age=60
Content-Type: text/html
Expires: Sat, 08 Jun 2013 19:00:05 GMT
Last-Modified: Sat, 08 Jun 2013 18:59:05 GMT
Location: /questions/824349/modify-the-url-without-reloading-the-page
Vary: *
X-Frame-Options: SAMEORIGIN
Date: Sat, 08 Jun 2013 18:59:05 GMT
Content-Length: 0
于 2013-06-08T19:00:44.023 回答
3

这是一个301 Moved Permanently重定向,即它在服务器端完成。您看不到刷新,因为浏览器没有打开第一个 URL,它立即重定向到第二个。

这是 chrome 控制台上的结果。

在此处输入图像描述

于 2013-06-08T19:03:26.170 回答
2

如何以与 SO 相同的方式实现 301 重定向。

(假设有一个名为questions列的表idtitle

(注意:SO 也可能大量使用 Memcached,而不是对每个页面视图进行数据库访问,但这是另一个主题。)

对于网址:

http://stackoverflow.com/questions/824349

您的 .htaccess 将以以下格式重写 URL questions.php?id=123&sef=abc-def

RewriteRule ^/questions/([0-9]+)/?([\w\-]*)$ /question.php?id=$1&sef=$2

你的 question.php 脚本

<?php
// Get the posted id (as int to prevent sql injection)
$id = isset($_GET['id']) ? (int) $_GET['id'] : 0;

// Get the posted search-engine-friendly title string (if any)
$sef = isset($_GET['id']) ? $_GET['sef'] : '';

// Connect to the database
mysqli_connect(...);

// Get the question with the provided id
$result = mysqli_query("SELECT * FROM questions WHERE id = {$id}");

// If a question was found
if ($row = mysqli_fetch_assoc($result)) {
    // Find the SEF title for the question (lowercase, replacing 
    // non-word characters with hyphens)
    $sef_title = strtolower(preg_replace('/[^\w]+/', '-', $row['title']);

    // If the generated SEF title is different than the provided one,
    if ($sef_title !== $sef) {
        // 301 the user to the proper SEF URL
        header("HTTP/1.1 301 Moved Permanently");
        header("Location: http://stackoverflow.com/question/{$id}/{$sef_title}");
    }
} else {
    // If no question found, 302 the user to your 404 page
    header("Location: http://stackoverflow.com/404.php");
}
于 2013-06-08T19:11:19.097 回答