使用哈希部分(锚)重定向 301 #

Posted

技术标签:

【中文标题】使用哈希部分(锚)重定向 301 #【英文标题】:Redirect 301 with hash part (anchor) # 【发布时间】:2010-11-16 18:49:03 【问题描述】:

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

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

我想使用 javascript 实现重定向以保留哈希部分,但搜索引擎不会知道我们的 URL 已更改。 (未返回代码 301)

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

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

【问题讨论】:

【参考方案1】:

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

然而,对于这个问题,不幸的是,锚位置没有作为 HTTP 请求的一部分发送到服务器。如果您想重定向用户,您需要在客户端的 Javascript 中执行此操作。

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

【讨论】:

【参考方案2】:

由于服务器永远不会看到#(排除301重定向)并且Google已经弃用了他们的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,因此新页面将被正确编入索引。

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

【讨论】:

这是否正常工作并保留了 SEO? 重定向工作正常,不能确定它是否适用于 SEO【参考方案3】:

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

你是对的,哈希部分没有发送到服务器,据我所知,没有一个好的方法可以创建一个包含哈希的重定向 url。

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

编辑:针对下面的评论,如果您需要的部分的外部网址中没有井号,那么完全可以重写网址。 Apache 重写规则会处理它:

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

如果您不使用 Apache,那么您必须查看服务器文档以了解类似的内容。

【讨论】:

你是对的,SE不索引哈希部分。但是例如,某人在他的网站上可以发布指向我们网站上视频的链接。(exemple.oursite.com/video_id=233) 该链接应该继续有效,以允许网络冲浪者播放我们的视频,但排名到 exemple.oursite。 com 需要转移到 www.oursite.com/example 您刚刚在评论中提供的示例缺少井号,因此与您的原始问题有很大不同。如果那是您要重写的 URL,那么这是可能的,我将更新我的答案。如果是这种情况,您应该澄清您的问题。 google 会忽略“#”。尝试在 google 中搜索“#”(不带引号)...因此 inurl:# 测试无效。【参考方案4】:

Google 为基于哈希 URL 的 AJAX 应用程序提供了一种特殊语法:http://code.google.com/web/ajaxcrawling/docs/getting-started.html

【讨论】:

【参考方案5】:

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

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

【讨论】:

【参考方案6】:

返回状态 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 的了解还不够,无法告诉您如何正确执行重写规则,但这应该让您了解您的服务器实际上是在告诉客户端做什么。

【讨论】:

太棒了,谢谢我怀疑你可以设置一个路径/位置部分。任何阅读的人请注意,您也可以使用 fidler、wireshark 或实时 http 标头。【参考方案7】:

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

【讨论】:

硬币的另一面是,您可以依靠哈希的 SE 非索引来规范化相似的内容(rand fishkin 在这里做了一个不错的解释:seomoz.org/blog/whiteboard-friday-using-the-hash),然后依靠 js进行跟踪【参考方案8】:

我注册了我的帐户,所以我无法编辑。

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

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

【讨论】:

在向后可比性方面,您几乎没有把握。我看到您重定向用户的唯一方法是通过 JavaScript,但这并不能解决您的搜索机器人问题,但就像其他人所说的那样,搜索机器人只关心 URL 的可请求部分,其中不包括哈希标签。

以上是关于使用哈希部分(锚)重定向 301 #的主要内容,如果未能解决你的问题,请参考以下文章

为啥这个 301 重定向会导致重定向到错误的 url?

301 重定向 - 替换 URL 的一部分

SSL 301 重定向错误 - Joomla 和 Nginx

使用 PHP 进行 301 或 302 重定向

详解301重定向及实现方法

重定向除部分 url 301 之外的所有 url