"网站跳转到其他网站"这个需求分两个完全相反的方向:你主动想让网站跳转(域名迁移、活动页、PC移动端适配),和你的网站被动跳转了(被挂马、被劫持、被植入恶意代码)。这篇文章把两种场景的方法、工具、排查步骤全部分开讲清楚。
一、先区分:主动跳转还是被动跳转
主动跳转(你自己要做的)
- 旧域名迁移到新域名,权重要传递
- HTTP升级到HTTPS,全站跳转
- PC端和移动端互跳
- 临时活动页跳转到主站
- 多域名统一跳转到主域名
- 页面URL改版后的旧链接跳转
被动跳转(被搞了,要修复)
- 打开网站自动跳到博彩/色情站
- 从百度点进来跳到其他网站
- 只在手机端跳转,PC端正常
- 偶尔跳、不是每次都跳
- 网站被植入恶意JS代码
- DNS被劫持导致跳转
二、主动跳转:四种方式的正确用法
| 跳转方式 | 执行位置 | SEO权重传递 | 适用场景 | 不能用的场景 |
|---|---|---|---|---|
| 301 永久重定向 | 服务器端(Nginx/Apache) | 90-99%传递 | 域名迁移、HTTP→HTTPS、URL永久改版 | 临时活动、短期跳转 |
| 302 临时重定向 | 服务器端 | 不传递(或少量) | 临时维护页、限时活动、用户登录跳转 | 域名永久迁移(权重不传) |
| JavaScript跳转 | 客户端(浏览器) | 几乎不传递 | 交互触发跳转(点击按钮跳转)、倒计时跳转 | 任何需要SEO的场景 |
| Meta Refresh | 客户端(HTML head) | 几乎不传递 | 旧式页面跳转,现在基本不推荐使用 | 所有场景(谷歌视同302,百度基本忽略) |
301重定向:域名迁移/HTTPS升级的唯一正确选择
301的意思是"这个页面永久搬家了,以后都去新地址"。搜索引擎看到301后,会把旧URL的权重、收录、外链全部转移到新URL。这是域名迁移时唯一应该用的跳转方式。
# ===== Nginx 301重定向配置 =====# 场景1:旧域名 → 新域名(全站跳转)server {listen 80;server_name old-domain.com www.old-domain.com;# 所有请求永久跳转到新域名,保留路径和参数return 301 https://www.new-domain.com$request_uri;}# 场景2:HTTP → HTTPSserver {listen 80;server_name www.example.com example.com;return 301 https://www.example.com$request_uri;}# 场景3:不带www → 带www(统一域名)server {listen 80;server_name example.com;return 301 https://www.example.com$request_uri;}# 场景4:单个旧页面 → 新页面location /old-page.html {return 301 https://www.example.com/new-page.html;}# 场景5:整个目录迁移location /old-blog/ {return 301 https://www.example.com/new-blog/;}# ===== Apache (.htaccess) 301重定向 =====# 旧域名跳新域名RewriteEngine OnRewriteCond %{HTTP_HOST} ^old-domain.com$ [OR]RewriteCond %{HTTP_HOST} ^www.old-domain.com$RewriteRule ^(.*)$ https://www.new-domain.com/$1 [R=301,L]# HTTP跳HTTPSRewriteCond %{HTTPS} offRewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]# 单页面跳转Redirect 301 /old-page.html https://www.example.com/new-page.html301跳转的三个常见错误
- 跳转链过长:A→B→C→D,经过3次以上跳转才到最终页面。搜索引擎可能中途放弃追踪,而且每次跳转增加200-500ms延迟。跳转链不要超过2次。
- 301跳转到不相关页面:旧页面讲的是"北京搬家",301跳到了网站首页而不是"北京搬家"的新URL。谷歌会把这种行为视为"软404",不传递权重。
- 旧域名和新域名内容不一致:旧域名做的是旅游攻略,买回来后301跳到一个卖服务器的站。谷歌不会把旧域名的权重传给你,因为内容完全不相关。
302重定向:什么时候该用,什么时候用错了
302的意思是"这个页面暂时不在,先去别的地方"。搜索引擎看到302后,会保留旧URL的索引,不会把权重传过去。很多人把本该用301的域名迁移用成了302,结果新域名一直没权重——这就是典型用错。
# 302正确用法示例# 场景1:网站临时维护,跳转到维护公告页# Nginxlocation / {return 302 /maintenance.html;}# 场景2:限时促销活动结束,跳回主站location /2026-summer-sale/ {return 302 https://www.example.com/;}# 场景3:用户未登录时跳转到登录页(带return参数)# 这个在应用代码里做,不在Nginx做# if not login:# redirect 302 to /login?return=/original-pageJavaScript跳转:什么时候可以用
JS跳转对SEO基本没用,但在以下场景是合理的:
// 场景1:用户点击按钮后跳转(这是JS跳转最合理的用法)document.getElementById("go-btn").addEventListener("click", function() {window.location.href = "https://www.new-domain.com/";});// 场景2:倒计时后自动跳转(比如"支付成功,5秒后跳回首页")setTimeout(function() {window.location.href = "https://www.example.com/";}, 5000);// 场景3:PC端检测到移动设备时跳转到移动版if (/Mobi|Android|iPhone/i.test(navigator.userAgent)) {window.location.href = "https://m.example.com" + window.location.pathname;}// ⚠️ 不推荐的JS跳转方式:// 页面一加载就直接跳转——这应该用301,不是JS// window.onload = function() {// window.location.href = "https://other-site.com"; // 应该用301// }三、被动跳转:网站被恶意跳转的排查与修复
如果你的网站自己没设跳转,但打开后自动跳到了博彩站、色情站、或者莫名其妙的广告页,那就是被搞了。下面按排查难度从浅到深来讲。
3.1 第一步:确认跳转发生在哪个环节
只有百度/谷歌搜进来才跳?
说明恶意代码判断了来源(Referer),只对搜索引擎来的流量跳转。检查网站JS文件中是否有判断document.referrer的跳转逻辑。
只有手机端跳,PC端正常?
恶意代码判断了User-Agent,只对移动端用户跳转。检查JS文件中是否判断了navigator.userAgent。
每次打开都跳,无差别?
跳转代码直接写在了首页或全局文件中。先检查index.php/index.html等入口文件,再看.htaccess有没有被篡改。
3.2 第二步:逐层排查跳转源头
# 排查顺序:从外到内,从服务器到代码## 第一层:检查DNS是否被劫持# 现象:你ping你的域名,返回的IP不是你的服务器IP# 排查:nslookup your-domain.com# 对比返回的IP和你的服务器IP是否一致# 如果不一致 → DNS被劫持,登录域名注册商后台检查DNS记录# 检查域名注册商后台的DNS记录是否被篡改# 重点检查:A记录、CNAME记录、NS记录、URL转发设置## 第二层:检查服务器配置文件# Nginx配置文件cat /etc/nginx/nginx.confcat /etc/nginx/sites-enabled/*# 查找可疑的return、rewrite、proxy_pass指令# Apache .htaccesscat /var/www/html/.htaccess# 查找可疑的RewriteRule、Redirect指令## 第三层:检查网站入口文件# 常见入口文件# index.php, index.html, default.php, home.php# WordPress: wp-content/themes/你的主题/header.php, footer.php, functions.php# 用grep批量搜索可疑代码grep -r "window.location" /var/www/html/ # JS跳转grep -r "eval(" /var/www/html/ # 加密恶意代码常用函数grep -r "base64_decode" /var/www/html/ # PHP解密恶意代码常用grep -r "document.referrer" /var/www/html/ # 判断来源的跳转grep -r "fromCharCode" /var/www/html/ # JS混淆常用方法## 第四层:检查数据库# 有些恶意代码存储在数据库的配置表或文章内容中# WordPress: wp_options, wp_posts, wp_postmeta# 搜索包含 script 标签或 iframe 的记录SELECT * FROM wp_posts WHERE post_content LIKE '%script%';SELECT * FROM wp_posts WHERE post_content LIKE '%iframe%';SELECT * FROM wp_options WHERE option_value LIKE '%redirect%';3.3 第三步:常见的恶意跳转代码长什么样
# 类型1:直接JS跳转(最直接,最容易发现)<script>window.location.href="http://恶意网站.com";</script># 类型2:带来源判断的JS跳转(只对搜索引擎来的流量跳转)<script>var refer = document.referrer;if(refer.indexOf("baidu.com")>0 || refer.indexOf("google.com")>0){window.location.href="http://恶意网站.com";}</script># 类型3:加密混淆的恶意JS(最难发现,需要解密)<script>var _0x3e5c=["恶意网站.com","referrer","baidu"]; // 混淆后看不出内容eval(function(p,a,c,k,e,d){...}(...)); // 用eval执行加密代码</script># 类型4:PHP恶意代码(写在index.php最前面或最后面)<?phpif(strpos($_SERVER['HTTP_REFERER'],'baidu.com')){header("Location: http://恶意网站.com");exit;}?># 类型5:.htaccess被篡改(劫持所有流量)RewriteEngine OnRewriteCond %{HTTP_REFERER} baidu\.com [NC]RewriteRule ^(.*)$ http://恶意网站.com/$1 [R=302,L]# 类型6:隐藏在正常JS文件末尾(如jquery.min.js)# 正常jQuery代码... ... ...# 下面偷偷加了几行:;eval(function(p,a,c,k,e,d){...}(...));3.4 第四步:清理和加固
清理步骤
- 先备份网站全部文件和数据库
- 删除所有找到的恶意代码/文件
- 检查文件修改时间,找出所有近期被修改的文件逐一审查
- 如果使用CMS(WordPress/DedeCMS等),替换所有核心文件为官方原版
- 更换所有密码(FTP、数据库、后台管理员、服务器SSH)
- 删除不认识的FTP账号和服务器用户
加固步骤
- 更新CMS、插件、主题到最新版本
- 设置关键目录为只读(wp-content/uploads、附件目录等禁止执行PHP)
- 安装安全插件(Wordfence/Sucuri等)
- 设置服务器防火墙,限制后台管理页面的访问IP
- 修改默认后台路径(/admin → 自定义路径)
- 启用HTTPS并设置HSTS头
- 定期自动备份(至少每天一次)
四、DNS劫持导致的跳转:服务器和代码都没问题但就是跳
如果你检查了服务器上的所有文件都没有恶意代码,但网站还是跳转到其他网站,那很可能是DNS劫持。

| 劫持类型 | 现象 | 排查方法 | 解决方案 |
|---|---|---|---|
| 域名注册商层面的劫持 | 域名后台的DNS记录被修改,A记录指向了别人的IP | 登录域名注册商后台,检查DNS记录、URL转发设置 | 改回正确的DNS记录,修改注册商账户密码,开启登录保护 |
| 本地DNS缓存劫持 | 只有你自己的电脑跳,别人打开正常 | 换一台设备/网络访问试试;用手机4G网络访问 | 清除本地DNS缓存(ipconfig /flushdns),查杀本机病毒 |
| 运营商DNS劫持 | 某个地区/运营商的用户跳,其他地区正常 | 用不同网络环境测试(电信/联通/移动);用VPN测试 | 启用HTTPS+HSTS;更换DNS为公共DNS(如阿里DNS 223.5.5.5);向运营商投诉 |
| 路由器劫持 | 连接某个WiFi时跳转,其他WiFi正常 | 检查路由器DNS设置是否被篡改;换一个路由器测试 | 重置路由器,修改路由器管理员密码,更新固件 |
# DNS劫持排查命令# 1. 检查域名解析的IP是否正确nslookup your-domain.comnslookup your-domain.com 8.8.8.8 # 用谷歌DNS查nslookup your-domain.com 223.5.5.5 # 用阿里DNS查# 如果不同DNS返回的IP不一样 → 确认是DNS劫持# 2. 检查DNS记录历史# 使用在线工具:https://tool.chinaz.com/dns/# 查看域名的A记录、CNAME记录是否和你的服务器IP一致# 3. 直接用IP访问测试# 在浏览器直接输入 http://你的服务器IP# 如果IP访问正常但域名访问跳转 → DNS劫持# 如果IP访问也跳转 → 服务器代码被篡改# 4. 检查HTTP响应头curl -I https://your-domain.com# 查看是否有异常的 Location 头或 Refresh 头五、网站被挂马后的百度/谷歌申诉流程
如果你的网站被恶意跳转到博彩或色情站,搜索引擎可能已经标记了你的网站为"危险"或"已黑"。清理完恶意代码后,必须主动申诉:
# 百度申诉流程# 1. 登录百度搜索资源平台(ziyuan.baidu.com)# 2. 进入"安全中心"→"站点安全检测"# 3. 如果显示"网站被黑"或"危险网站",点击"申请解封"# 4. 提交申诉材料:# - 说明网站被黑的时间和原因# - 证明已清除恶意代码(附上修复截图)# - 证明已修复安全漏洞(更新了CMS/插件等)# 5. 百度审核周期:通常3-7个工作日# 谷歌申诉流程# 1. 登录 Google Search Console# 2. 进入"安全与手动操作"→"安全问题"# 3. 确认所有恶意代码已清除# 4. 点击"请求审核"# 5. 详细说明:# - 发现了什么恶意代码# - 采取了什么措施清除# - 做了什么来防止再次发生# 6. 谷歌审核周期:通常1-3天# 注意事项:# - 一定要在确认完全清理干净后再申诉,多次申诉失败会增加审核难度# - 申诉通过后,谷歌/百度可能需要1-4周重新抓取和恢复排名# - 排名恢复程度取决于被黑持续的时间,时间越长恢复越慢六、域名迁移时的301跳转完整检查清单
域名迁移是网站跳转最常见的主动场景。做对了,权重无缝迁移;做错了,半年SEO白干。
域名迁移301跳转检查清单
跳转前(上线前验证):
✅ 确认用的是301而不是302
✅ 旧域名的每个页面都跳转到新域名对应的页面(不是全跳首页)
✅ 跳转链不超过2次(旧域名→新域名,中间不要有中间跳转)
✅ 测试带参数的URL也能正确跳转(如 ?id=123)
✅ HTTP和HTTPS都能正确跳转
✅ 不带www的旧域名也配置了跳转

跳转后(上线后验证):
✅ 用curl -I检查返回的HTTP状态码是301
✅ 在Google Search Console提交"地址更改"(旧域名→新域名)
✅ 在百度搜索资源平台提交"网站改版"
✅ 旧域名的sitemap继续保留至少3个月
✅ 监控新域名的收录量和排名变化
✅ 旧域名不要立即过期,至少保留1年
# 用curl验证301跳转是否生效# 检查HTTP状态码curl -I http://old-domain.com# 期望输出:# HTTP/1.1 301 Moved Permanently# Location: https://www.new-domain.com/# 检查完整跳转链curl -I -L http://old-domain.com/old-page.html# -L 参数会跟随跳转,看最终落在哪个URL# 批量检查多个旧URL的跳转# 把旧URL列表保存在urls.txt中,一行一个while read url; doecho "$url → $(curl -s -o /dev/null -w '%{redirect_url}' $url)"done < urls.txt七、移动端跳转:PC和手机版之间的正确跳转姿势
一个网站有PC版(www.example.com)和移动版(m.example.com),用户用手机访问PC版时需要跳转到移动版。这个跳转怎么做才不影响SEO?
正确做法(谷歌和百度都推荐):在PC版页面的HTML head中添加<link rel="alternate">标签指向移动版URL,在移动版页面添加<link rel="canonical">指向PC版URL。搜索引擎看到这两个标签就知道它们是同一个内容的不同版本,不会判定为重复内容。跳转用302而非301,因为用户下次用PC访问时应该回到PC版。

<!-- PC版页面 (www.example.com/page) 的 head 中 --><link rel="alternate" media="only screen and (max-width: 640px)"href="https://m.example.com/page"><!-- 移动版页面 (m.example.com/page) 的 head 中 --><link rel="canonical" href="https://www.example.com/page"># 服务端检测User-Agent做302跳转(Nginx)server {listen 80;server_name www.example.com;# 检测移动端User-Agentset $mobile_rewrite do_not_perform;if ($http_user_agent ~* "(android|iphone|ipod|blackberry|webos|mobile)") {set $mobile_rewrite perform;}# 移动端302跳转到移动版if ($mobile_rewrite = perform) {rewrite ^ https://m.example.com$request_uri redirect;}}八、URL改版:批量旧链接跳转的正确做法
网站改版后URL结构变了,几百个旧URL都要跳转到新URL。手动一条条写301不现实,用规则批量处理:
# Nginx 批量URL重定向规则# 场景1:去掉URL中的日期部分# 旧URL: /2024/03/15/article-title.html# 新URL: /article/article-title.htmllocation ~ ^/\d{4}/\d{2}/\d{2}/(.+)$ {return 301 /article/$1;}# 场景2:URL后缀从.html变成/# 旧URL: /about-us.html# 新URL: /about-us/location ~ ^/(.+)\.html$ {return 301 /$1/;}# 场景3:分类目录改名# 旧URL: /category-old/xxx# 新URL: /category-new/xxxlocation /category-old/ {rewrite ^/category-old/(.*)$ /category-new/$1 permanent;}# 场景4:如果规则无法覆盖所有情况,用map批量映射# 在nginx.conf中定义URL映射表map $uri $new_uri {/old-page-1.html /new-page-1/;/old-page-2.html /new-page-2/;/old-product-3.html /new-product-3/;# ... 几百条映射}server {# 如果匹配到映射,就301跳转if ($new_uri) {return 301 $new_uri;}}九、UC建站系统的网站跳转管理方案
UC建站系统 · 网站跳转与安全防护
UC建站系统提供了网站跳转管理和安全防护的一体化方案:
- 可视化301跳转管理:后台界面批量配置旧URL到新URL的301跳转,支持CSV导入、正则规则、一键全站HTTPS跳转
- 域名迁移向导:旧域名→新域名的完整迁移流程引导,自动生成Nginx/Apache配置代码,跳转链检测确保不超过2次
- 安全巡检与挂马检测:每日自动扫描网站文件,检测可疑的跳转代码、加密JS、异常文件修改,发现后即时告警
- 恶意跳转自动拦截:实时监控网站流量中的异常跳转行为,自动阻断并记录攻击来源
额外能力:
- 移动端自适应跳转:自动检测设备类型并配置302跳转和alternate标签
- 跳转效果监控:旧URL的301跳转后收录转移进度追踪
- 安全加固一键部署:文件权限设置、后台路径修改、HTTPS强制开启
- 百度/谷歌自动申诉辅助:生成标准格式的安全申诉材料
最后说一句
网站跳转这件事,主动和被动是两个世界。主动跳转的关键是选对方式:域名迁移用301、临时活动用302、交互跳转用JS。用错了方式,轻则权重不传递,重则被搜索引擎判定为作弊。
被动跳转(被挂马)的关键是排查顺序:先确认是DNS劫持还是代码被篡改,然后从外到内逐层查——DNS记录→服务器配置→网站入口文件→JS文件→数据库。清理完一定要修复漏洞,不然清了白清,第二天又会被挂上。换密码、更新程序、设权限,这三件事一件都不能少。
