AJAX 支持搜索引擎问题分析

AJAX 支持搜索引擎问题分析

搜索引擎可以的爬行器(spider)抓取网站的数据,并将其存储在搜索引擎的数据库中。搜索引擎将这些数据从数据库中检索出来以满足用户的查询需求。然而,一些网站是使用了 AJAX 技术来实现异步请求的,这可能会导致搜索引擎无法获取到这些网站的数据,而无法对其进行索引。

要解决这个问题,我们需要做一些改变,以便搜索引擎可以正确地获得网站的数据。

1.使用 Escape Fragment(转义片段)来处理 URL

搜索引擎可以检索 URL 中的数据,并将其转换为搜索结果。然而,如果我们的网站使用了 AJAX 技术,那么这些 URL 将不再包含必要的信息,导致搜索引擎无法正确地检索这些数据。要解决这个问题,我们可以通过使用 Escape Fragment 来处理 URL。

例如,在普通的 URL 中,数据被传递到服务器的方式可能是这样的:https://www.example.com/search?query=keyword。 在使用 AJAX 技术的网站上,JavaScript 代码可能会向服务器发出异步请求,例如: https://www.example.com/search#!query=keyword。 在这里,我们使用了问号(?)来分隔关键词和值,但是使用 AJAX 技术时,我们必须使用井号(#)。

要使这些 URL 对搜索引擎可用,我们可以使用 Escape Fragment。这项技术利用了搜索引擎在 URL 中发现井号(#)时处理 URL 的方法,以便读取基于 AJAX 的内容。

例如,我们可以在网站的头部加入以下代码:

<meta name="fragment" content="!">

这将告诉搜索引擎,当发现 URL 中出现井号(#)时,请将其转换为 Escape Fragment,然后检索该页面的内容。

2.提供 AJAX 钩子

搜索引擎无法识别 AJAX 动态更新的网页。 要使搜索引擎知道网站是否使用 AJAX 技术动态更新数据,请为每个页面提供 AJAX 钩子。 钩子是一种向搜索引擎发送 crawled 和 indexed 信号的技术。

例如,可以在 WordPress 网站上使用以下代码来提供 AJAX 钩子:

function my_asynchronous_content() {
  if ( ! is_singular() ) {
    return false;
  }
  if ( false == strpos( get_template(), 'single' ) ) {
    return false;
  }
  return true;
}
function my_fragment() {
  global $post;
  if ( ! my_asynchronous_content() ) {
    return '';
  }
  $html = '<div class="my-asynchronous-content">';
  ob_start();
  get_template_part( 'content', 'single' ); // the loop
  $loop_contents = ob_get_clean();
  $html .= $loop_contents;
  $html .= '</div>';
  return $html;
}
function my_status_header( $status_header, $header, $text, $protocol ) {
  if ( ! $protocol || 'HTTP/1.1' != $protocol ) {
    return $status_header;
  }
  if ( preg_match( '/^\d+/', $status_header, $matches ) ) {
    $status_code = intval( $matches[0] );
  } else {
    $status_code = 200;
  }
  if ( $status_code >= 200 && $status_code < 300 ) {
    header( 'X-WP-Nocache: ' . $_SERVER['REQUEST_URI'] );
  }
  return $status_header;
}
function my_setup_head() {
  if ( my_asynchronous_content() ) {
      add_action( 'wp_head', 'my_asynchronous_script', 50 );
  }
}
function my_asynchronous_script() {
?>
  <script type="text/javascript">
    jQuery(document).ready(function($) {
      if (typeof history.pushState !== "undefined") {
        var url = window.location.href;
        $('.my-asynchronous-content').each(function() {
          $(this).attr('id', 'tmp-' + Math.floor(Math.random() * 99999).toString(16));
          var tmp_container = $('#' + $(this).attr('id')).get(0);
          var my_fragment = $(this).parent().next('.my-asynchronous-content-data').html();
          history.replaceState({
            'ajax_content': true,
            'my_fragment': my_fragment
          }, '', url);
          $(this).html('');
          $.ajax({
            url: url,
            type: 'GET',
            success: function(response) {
              var el = $('.my-asynchronous-content', response).filter(function() {
                return $(this).attr('id') === tmp_container.id;
              });
              el.html($(el).parent().next('.my-asynchronous-content-data').html()).css('display', $(tmp_container).css('display')).css('visibility', 'visible');
              var new_title = $('title', response).text();
              $('title').text(new_title);
              history.replaceState({
                'ajax_content': true,
                'my_fragment': el.parent().next('.my-asynchronous-content-data').html()
              }, '', url);
            }
          });
        });
        $(window).on('popstate', function(event) {
          if ( event.originalEvent.state && event.originalEvent.state.ajax_content && event.originalEvent.state.my_fragment ) {
            $('.my-asynchronous-content').html(event.originalEvent.state.my_fragment);
            var new_title = $('title', response).text();
            $('title').text(new_title);
          }
        });
      } else {
        console.log('History API is not supported');
      }
    });
  </script>
<?php
}
add_filter( 'status_header', 'my_status_header', 10, 4 );
add_action( 'wp_enqueue_scripts', 'my_setup_head' );
add_action( 'wp_footer', 'my_fragment' );

通过提供 AJAX 钩子,我们可以让搜索引擎知道网站中有一些 AJAX 动态数据,并为其提供索引。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:AJAX 支持搜索引擎问题分析 - Python技术站

(0)
上一篇 2023年6月11日
下一篇 2023年6月11日

相关文章

  • JavaScript定时器设置、使用与倒计时案例详解

    JavaScript定时器设置、使用与倒计时案例详解 定时器 JavaScript定时器是一种在指定时间间隔内反复执行指定的代码段的机制。利用定时器可以实现一些定时操作,例如轮询、闪烁等等。JavaScript中提供了两种定时器,分别是: setInterval: 可以反复执行指定的代码段,直到清除定时器。 setTimeout: 在指定时间间隔内执行一次代…

    JavaScript 2023年6月11日
    00
  • JS定义类的六种方式详解

    JS定义类的六种方式详解 JavaScript 是一门面向对象的编程语言,定义类是面向对象编程中非常重要的部分。在JavaScript中,定义类的方式有六种。 方式一:函数定义类 使用函数定义类是最常见的方式之一。 function Person(name, age) { this.name = name; this.age = age; } Person.…

    JavaScript 2023年5月27日
    00
  • 详解在Javascript中进行面向切面编程

    下面我将详细讲解在Javascript中进行面向切面编程的完整攻略。 什么是面向切面编程 在介绍如何在Javascript中进行面向切面编程之前,我们先来了解一下什么是面向切面编程(Aspect-Oriented Programming,简称AOP)。 AOP是一种编程思想,它可以对横跨多个模块的代码进行集中式管理。在AOP中,我们可以通过切面来描述一个横跨…

    JavaScript 2023年5月18日
    00
  • 关于JavaScript中parseInt()的一个怪异行为解决

    关于JavaScript中parseInt()的一个怪异行为解决 在JavaScript中,parseInt()是一个常用的全局函数,用于将字符串转换为整数。但是在使用该函数时,有一些奇怪的行为需要注意。 parseInt()的奇怪行为 在解析数字字符串时,parseInt()函数除了将前导的零字符去掉之外,还会忽略其中的非数字字符。这意味着即使字符串中包含…

    JavaScript 2023年5月28日
    00
  • 实例讲解javascript注册事件处理函数

    当我们需要让页面元素触发一些行为时,就需要使用JavaScript来为元素绑定事件处理函数。在JavaScript中,可以通过为元素添加一个事件处理函数来捕获指定的事件类型,例如按钮的click事件、键盘按键事件等。本篇攻略将详细介绍如何使用JavaScript注册事件处理函数,并提供两个实例来说明事件处理的具体应用。 注册事件处理函数的方法 JavaScr…

    JavaScript 2023年6月10日
    00
  • 基于JavaScript 性能优化技巧心得(分享)

    基于JavaScript 性能优化技巧心得(分享) JavaScript 在网页交互中扮演着非常重要的角色,但是 JavaScript 的执行效率相对较差,因此,为了提高网页性能,我们需要对 JavaScript 进行性能优化。本文将介绍几个基于 JavaScript 性能优化技巧的心得。 减少全局变量使用 全局变量在 JavaScript 中会优先存在于全…

    JavaScript 2023年6月11日
    00
  • javascript设计模式之Adapter模式【适配器模式】实现方法示例

    下面我会详细讲解“Javascript设计模式之Adapter模式【适配器模式】实现方法示例”的完整攻略,包括如何使用适配器模式以及示例的具体实现。 什么是适配器模式? 适配器模式是一种行为型设计模式,用于将一个类的接口转换成另一个客户端所期望的接口。通俗来讲,就是使得一个类能够应对多种不同的接口。 适配器模式的应用场景 在实际的编程中,适配器模式的应用场景…

    JavaScript 2023年6月10日
    00
  • Javascript无参数和有参数类继承问题解决方法

    Javascript无参数和有参数类继承问题解决方法 在Javascript中,实现类的继承是非常方便的。但是在实践中,我们往往会遇到一些继承问题,其中常见的问题是我们从父类中继承了一些属性和方法,但是我们希望在子类中传入一些特定的参数来修改这些属性和方法。在这种情况下,我们需要解决Javascript无参数和有参数类继承问题。 解决无参数类继承问题的方法 …

    JavaScript 2023年5月27日
    00
合作推广
合作推广
分享本页
返回顶部