使用散列部分重定向301(锚点)#

时间:2009-08-04 18:43:06

标签: url redirect hash url-rewriting

我们的某个网站的网址如下:example.oursite.com。我们决定使用此www.oursite.com/example之类的网址移动我们的网站。为此,我们在Apache服务器中编写了一条重写规则,该规则使用代码301重定向到我们的新URL。

许多网站都使用example.oursite.com/#id=23格式的网址链接到我们。问题是重定向用IE删除URL的哈希部分。据我所知,哈希部分永远不会发送到服务器。

我想用javascript实现重定向以保留散列部分,但搜索引擎不会意识到我们的URL已更改。 (没有返回代码301)

我希望搜索引擎收到新网址的通知(301),因为我们需要将网页排名转移到新网址。

有没有办法使用301代码重定向并保留URL中的哈希部分(#id=23)?

8 个答案:

答案 0 :(得分:14)

搜索引擎实际上关心哈希标签,他们经常使用它们来突出显示页面上的特定内容。

但是,对于这个问题,遗憾的是,锚点位置不会作为HTTP请求的一部分发送到服务器。如果要重定向用户,则需要在客户端的Javascript中执行此操作。

好文章:http://web.archive.org/web/20090508005814/http://www.mikeduncan.com/named-anchors-are-not-sent/

答案 1 :(得分:2)

我相当确定URL的哈希/页面锚点/书签部分没有被搜索引擎索引,因此对您的页面排名没有影响。对谷歌搜索“inurl:#”会返回零文档,这样就可以支持我的假设。来自外部网站的链接将被编入索引而没有哈希值。

你是正确的,哈希部分没有发送到服务器,所以据我所知,没有一种好方法可以创建一个带有哈希的重定向URL。

因此,浏览器可以在重定向期间正确管理哈希。 Firefox 3.5似乎成功完成了这项工作。如果将哈希附加到具有已知重定向的URL,您将看到地址栏中的URL更改为新位置,但哈希成功保留在那里。

修改:为了回应下面的评论,如果您需要的部分的外部网址中不是哈希标志,则完全可以重写URL。 Apache重写规则会处理它:

RewriteCond %{HTTP_HOST}   !^exemple\.oursite\.com [NC]
RewriteCond %{HTTP_HOST}   !^$
RewriteRule ^/(.*)         http://www.oursite.com/exemple/$1 [L,R]

如果您没有使用Apache,那么您必须查看服务器文档中的类似内容。

答案 2 :(得分:2)

Google有一种基于哈希网址的AJAX应用程序的特殊语法:http://code.google.com/web/ajaxcrawling/docs/getting-started.html

答案 3 :(得分:1)

您可以在旧地址上创建一个页面,用于捕获所有请求并使用正确的地址和代码重定向到新站点。

我做了类似的事情,但它是在asp.net中,我想这不是你使用的语言。无论如何,应该有一种方法可以用任何语言来做到这一点。

答案 4 :(得分:1)

当返回状态301时,您的服务器应该返回指向新位置的“Location:”标题。在实践中,实施方式各不相同;有些服务器提供完整的URL(netloc和路径),有些服务器只提供新的路径,并希望浏览器在原始的netloc上查找该路径。听起来你的重写规则正在剥离道路。

在python shell中查看返回的Location标头的简单方法:

>>> import httplib
>>> conn = httplib.HTTPConnection('exemple.oursite.com')
>>> conn.request('HEAD', '/')
>>> res = conn.getresponse()
>>> print res.getheader('location')

我担心我对mod_rewrite的了解不足以告诉你如何正确地执行重写规则,但是这应该让你知道你的服务器实际上告诉客户要做什么。

答案 5 :(得分:1)

看到服务器永远不会看到#(排除301重定向)而谷歌已弃用他们的AJAX Crawling scheme,看来前端解决方案是唯一的方法!

我是怎么做到的:

 (function() {

    var redirects = [
        ['#!/about',         '/about'],
        ['#!/contact',       '/contact'],
        ['#!/page-x',        '/pageX']
    ]

    for (var i=0; i<redirects.length; i++) {
        if (window.location.hash == redirects[i][0]) {
           window.location.replace(redirects[i][1]);
        }
    }

 })();

我假设因为Google抓取工具确实执行了Javascript,新页面将被正确编入索引。

我已将其放在<script>标记正下方的<title>标记中,以便在任何其他JS / CSS之前执行。请注意,只有索引文件才需要此脚本。

答案 6 :(得分:0)

我已注册我的帐户,因此无法修改。

zombat:对不起,我在评论中犯了一个错误。我们视频的链接是exemple.oursite.com/#video_id=233。在这种情况下,我在Apache中的重写规则不起作用。

Nick Berardi:我们改变了链接的工作方式。我们不再使用#,仅用于向后兼容

答案 7 :(得分:0)

搜索机器人不关心哈希标签。如果您将它们用于某种闪存或AJAX调用,那么您遇到的问题比301重定向不起作用更严重。因为除非你有替代形式的内容,否则搜索引擎不会为你的网站建立索引,而且就SEO而言你肯定会受到影响。