下面我将从实现原理具体方法最佳实践注意事项四个方面,详细解释如何实现PC网站跳转到移动网站。

pc网站跳到移动网站
(图片来源网络,侵删)

实现原理

核心原理非常简单:在服务器端或客户端检测用户的设备类型,如果是移动设备,则执行重定向。

  • 服务器端检测:服务器在发送网页内容之前,先检查请求的 User-Agent 字符串。User-Agent 是浏览器发送给服务器的信息,包含了浏览器类型、操作系统、设备型号等。User-Agent 中包含移动设备的关键词(如 "Mobile", "Android", "iPhone"),服务器就返回移动网站的页面。
  • 客户端检测:网页加载后,由网页中的 JavaScript 代码来检测屏幕尺寸或 User-Agent,然后执行重定向。

推荐方法服务器端检测 是目前最主流、最可靠的方法,因为它在页面加载前就完成了重定向,用户体验更流畅,且能减少不必要的带宽消耗。


具体实现方法

这里我们主要介绍服务器端检测的实现方法,因为它效果最好。

方法1:使用服务器端脚本(如 PHP)

这是最常见的方法之一,尤其适用于使用 PHP 语言搭建的网站,你可以在网站的入口文件(如 index.php)或一个公共的配置文件中添加以下代码。

pc网站跳到移动网站
(图片来源网络,侵删)
<?php
// 获取 User-Agent 信息
$user_agent = $_SERVER['HTTP_USER_AGENT'];
// 定义一个包含常见移动设备关键词的数组
$mobile_agents = array(
    'iPhone', 'iPad', 'iPod', 'Android', 'BlackBerry', 'webOS', 
    'Windows Phone', 'Opera Mini', 'IEMobile', 'Mobile'
);
// 检查 User-Agent 是否包含移动设备关键词
$is_mobile = false;
foreach ($mobile_agents as $device) {
    if (strpos($user_agent, $device) !== false) {
        $is_mobile = true;
        break;
    }
}
// 如果是移动设备,并且当前不是在移动子域名下,则重定向
if ($is_mobile && strpos($_SERVER['HTTP_HOST'], 'm.') !== 0) {
    // 构建移动网站的 URL
    $mobile_url = 'https://m.' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
    // 执行重定向
    header("Location: " . $mobile_url);
    exit(); // 确保脚本在重定向后停止执行
}
?>

如何使用

  1. 将上述代码放在你网站的 index.php 文件的最顶部,或者在所有页面都会加载的公共头部文件中。
  2. 确保 m.yourdomain.com 已经正确配置并指向你的移动网站。

方法2:使用 .htaccess 文件(适用于 Apache 服务器)

如果你的网站托管在 Apache 服务器上,使用 .htaccess 文件是实现此功能的经典且高效的方式,无需修改 PHP 代码。

在网站根目录下创建或编辑 .htaccess 文件,添加以下规则:

# 检查 User-Agent 是否为移动设备
RewriteCond %{HTTP_USER_AGENT} "android|blackberry|ipad|iphone|ipod|iemobile|opera mini|palm|webos" [NC]
# 如果当前访问的不是 m. 子域名
RewriteCond %{HTTP_HOST} !^m\. [NC]
# 执行重定向到 m. 子域名,并保持原始请求的路径和参数
RewriteRule ^(.*)$ https://m.%{HTTP_HOST}/$1 [L,R=302]

代码解释

pc网站跳到移动网站
(图片来源网络,侵删)
  • RewriteCond: 设置重定向的条件。
    • %{HTTP_USER_AGENT}: 获取用户的 User-Agent。
    • [NC]: 表示不区分大小写。
    • %{HTTP_HOST}: 获取用户访问的主机名(如 www.yourdomain.com)。
    • !^m\.: 表示主机名不以 m. 开头,避免无限重定向。
  • RewriteRule: 定义重定向规则。
    • ^(.*)$: 匹配 URL 中的所有路径和参数。
    • https://m.%{HTTP_HOST}/$1: 将其重定向到 m. 开头的地址,并保留原始路径。
    • [L]: 表示如果此规则匹配,则停止处理后续的 RewriteRule。
    • [R=302]: 执行一个 302(临时重定向),如果确定移动网站是永久性的,可以改为 [R=301](永久重定向),但请注意,301 重定向会被浏览器缓存,测试时可能需要清除缓存。

方法3:使用 JavaScript(客户端检测)

这种方法可以作为后备方案,或者在无法修改服务器配置时使用,但它有一个缺点:用户会先看到PC版网页,然后页面会“闪动”一下,再跳转到移动版,体验稍差。

<script>
function checkAndRedirect() {
    // 检测屏幕宽度是否小于某个阈值(768px)
    if (window.innerWidth <= 768) {
        // 或者检测 User-Agent
        // if (/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)) {
        // 如果是移动设备,且不在移动子域名下,则重定向
        if (!window.location.href.includes('m.')) {
            window.location.href = 'https://m.' + window.location.host + window.location.pathname;
        }
    }
}
// 页面加载完成后执行
window.onload = checkAndRedirect;
// 可选:监听窗口大小变化,如果用户旋转设备,可以再次检查
window.onresize = checkAndRedirect;
</script>

如何使用: 将这段代码放在你网站 <head> 标签内的任意位置即可。


最佳实践与注意事项

  1. 重定向类型选择:301 vs 302

    • 302 (临时重定向):这是推荐的初始选择,搜索引擎会将 m.www. 视为同一个网站的两个版本,并将权重传递给原始的 www. 域名,这对于SEO比较友好。
    • 301 (永久重定向):如果你已经决定将移动流量永久导向移动网站,可以使用301,但请注意,这会将 www. 域名的SEO权重完全转移到 m. 域名,使用前请务必深思熟虑。
  2. 避免重定向循环

    • 非常重要! 你的代码必须确保:移动设备访问 m. 域名时,不能再次重定向回去
    • 在 PHP 和 .htaccess 的示例中,我们都通过检查 HTTP_HOST 是否以 m. 开头来避免了这个问题。
  3. 使用 Vary: User-Agent HTTP 头

    • 这个HTTP头告诉缓存服务器(如CDN)和搜索引擎,这个页面的内容会根据 User-Agent 的不同而不同。
    • 优点:可以防止搜索引擎将PC版内容错误地索引为移动版内容,有助于SEO。
    • 如何设置
      • PHP: header("Vary: User-Agent");
      • .htaccess: Header append Vary User-Agent
  4. 提供“返回PC版”的链接

    在你的移动网站上,务必提供一个明显的链接(通常在页脚),让用户可以方便地切换回PC版网站,这提升了用户体验。

  5. 考虑“响应式设计”(Responsive Design)

    • 除了将流量导向独立的移动网站,现代Web开发的最佳实践是响应式设计
    • 响应式设计只维护一个网站,但使用CSS媒体查询(@media)等技术,让网页布局和内容能够根据不同屏幕尺寸自动调整。
    • 优点:无需重定向,URL保持不变,对SEO最友好,开发和维护成本更低。
    • 选择建议:如果条件允许,优先采用响应式设计,只有在移动端和PC端的内容、结构差异巨大时,才考虑使用独立的移动网站。

方法 优点 缺点 适用场景
服务器端 (PHP/.htaccess) 用户体验好(无闪动)、SEO友好效率高 需要服务器权限 强烈推荐,是行业标准做法。
客户端 (JavaScript) 实现简单,无需服务器配置 用户体验差(有闪动)、依赖JS、可能被禁用 作为后备方案,或无法修改服务器时。
响应式设计 最佳SEO、URL统一、维护简单 对前端开发要求较高 现代Web开发的首选,尤其适合内容差异不大的网站。

对于你的需求,使用 .htaccess (Apache) 或 PHP 代码进行服务器端重定向 是最直接、最有效的解决方案,请务必遵循最佳实践,避免重定向循环,并考虑提供返回PC版的链接。