在检测死链之前,必须确保服务器的404返回状态码是标准的。很多配置错误的网站虽然显示了404页面,但HTTP状态码返回的是200,这会导致搜索引擎认为这是一个正常页面,从而严重影响SEO。以下是针对Nginx和Apache环境的配置方案。
找到网站对应的Nginx配置文件(通常在 /www/server/panel/vhost/nginx/ 或 /etc/nginx/conf.d/ 目录下),在 server 块中添加或修改以下指令:
server {
listen 80;
server_name yourdomain.com;
root /www/wwwroot/yourdomain.com;
index index.php index.html;
核心配置:确保404错误页面指向正确的文件,且不进行重定向
error_page 404 /404.html;
防止访问不存在的动态文件时返回200,需配合FastCGI配置
location ~ \.php$ {
fastcgi_pass unix:/tmp/php-cgi.sock;
fastcgi_index index.php;
include fastcgi.conf;
确保PHP文件不存在时传递404状态码
fastcgi_intercept_errors on;
}
确保静态资源不存在时返回404
location ~ \.(js|css|jpg|jpeg|gif|png)$ {
log_not_found off;
access_log off;
}
}
配置完成后,执行命令重载Nginx:
nginx -t && nginx -s reload
在网站根目录下的 .htaccess 文件中添加以下代码:
ErrorDocument 404 /404.html
同时,检查Apache配置文件 httpd.conf,确保 AllowOverride 设置为 All,以保证 .htaccess 生效。
配置完毕后,不要只看页面显示,必须使用命令行工具验证HTTP头信息。在终端执行以下命令:
curl -I http://yourdomain.com/notexist.html
输出结果中必须包含 HTTP/1.1 404 Not Found。如果显示 HTTP/1.1 200 OK,说明配置有误,需重新检查上述步骤。
迅睿CMS自带了站点地图功能,我们可以利用这一特性,通过Python脚本读取站点地图中的所有链接,进行批量存活检测。这种方法比使用第三方软件更安全、更精准,且能直接生成符合搜索引擎提交格式的死链文件。
确保服务器已安装Python 3环境。如果没有安装,执行以下命令:
CentOS/RHEL
yum install python3 -y
Ubuntu/Debian
apt install python3 -y
在网站根目录或任意目录下创建文件 check_dead_links.py,复制以下完整代码。该脚本会自动抓取 sitemap.xml,检测所有链接状态,并将死链接写入 deadlinks.txt。
!/usr/bin/env python3
import requests
import xml.etree.ElementTree as ET
import urllib.parse
from concurrent.futures import ThreadPoolExecutor
import time
配置区域
DOMAIN = "http://yourdomain.com" 修改为你的域名
SITEMAP_URL = DOMAIN + "/sitemap.xml"
OUTPUT_FILE = "deadlinks.txt"
TIMEOUT = 10 请求超时时间
THREADS = 20 并发线程数
def get_urls_from_sitemap(sitemap_url):
"""解析Sitemap获取所有URL"""
urls = []
try:
headers = {'User-Agent': 'Mozilla/5.0 (compatible; DeadLinkBot/1.0)'}
resp = requests.get(sitemap_url, headers=headers, timeout=TIMEOUT)
resp.raise_for_status()
root = ET.fromstring(resp.content)
处理标准sitemap格式
namespace = {'ns': 'http://www.sitemaps.org/schemas/sitemap/0.9'}
for url in root.findall('ns:url/ns:loc', namespace):
urls.append(url.text)
如果是索引sitemap,递归获取
for sitemap in root.findall('ns:sitemap/ns:loc', namespace):
urls.extend(get_urls_from_sitemap(sitemap.text))
except Exception as e:
print(f"获取Sitemap失败: {e}")
return urls
def check_url(url):
"""检测单个URL状态"""
try:
headers = {'User-Agent': 'Mozilla/5.0 (compatible; DeadLinkBot/1.0)'}
禁止重定向,精准获取状态码
resp = requests.head(url, headers=headers, timeout=TIMEOUT, allow_redirects=False)
status = resp.status_code
判定死链标准:404 或 410 (Gone) 或 5xx错误
if status == 404 or status == 410 or status >= 500:
return url
检测软404:页面存在但内容极少或包含特定字符(需根据实际站点调整)
elif status == 200:
这里可以添加逻辑检查页面内容是否包含"未找到"等字样
pass
except requests.RequestException:
连接超时或DNS解析失败通常也视为死链
return url
return None
def main():
print(f"开始读取Sitemap: {SITEMAP_URL}")
all_urls = get_urls_from_sitemap(SITEMAP_URL)
print(f"共获取 {len(all_urls)} 个链接,开始检测...")
dead_links = []
使用多线程加速检测
with ThreadPoolExecutor(max_workers=THREADS) as executor:
results = executor.map(check_url, all_urls)
for res in results:
if res:
dead_links.append(res)
print(f"发现死链: {res}")
写入文件
if dead_links:
with open(OUTPUT_FILE, 'w', encoding='utf-8') as f:
for link in dead_links:
f.write(link + '\n')
print(f"检测完成,共发现 {len(dead_links)} 个死链,已保存至 {OUTPUT_FILE}")
else:
print("恭喜,未发现死链。")
if __name__ == "__main__":
main()
将代码中的 yourdomain.com 替换为你的实际域名,然后运行脚本:
python3 check_dead_links.py
运行结束后,当前目录下会生成 deadlinks.txt 文件,里面列出了所有检测到的死链地址,每行一个。
搜索引擎要求死链文件必须放在网站根目录下,且能通过 域名/deadlinks.txt 直接访问。我们需要将生成的文件移动到正确位置,并配置服务器允许访问。

假设你的网站根目录是 /www/wwwroot/yourdomain.com,执行:
mv deadlinks.txt /www/wwwroot/yourdomain.com/deadlinks.txt
部分Nginx配置默认禁止访问txt文件以保护敏感信息。需在Nginx配置的 server 块中添加:
location ~ /deadlinks.txt {
add_header Content-Type "text/plain; charset=UTF-8";
}
重载Nginx后,在浏览器访问 http://yourdomain.com/deadlinks.txt,确认能看到内容且编码正常(无乱码)。
生成文件后,最后一步是通知搜索引擎。百度和Google的处理方式不同,需分别操作。
百度支持“死链提交”功能,分为“规则提交”和“文件提交”。对于死链数量较多的情况,推荐使用文件提交。
操作步骤:
Google没有直接的死链文件上传接口,对于Google,最好的方式是确保404状态码正确,Google会自动降低死链权重。如果想加速处理,可以使用 移除工具。
操作步骤:
检测出死链后,除了提交给搜索引擎,更重要的是修复这些链接,避免用户流失。以下是迅睿CMS中常见的修复策略。
如果某个栏目或文章被删除,导致大量 /category/old-id 的死链,应在Nginx中配置301重定向到新的相关页面或首页。
编辑Nginx配置文件
location ~ ^/category/old-id {
return 301 /category/new-id;
}
对于由于改版导致的URL结构变化,不要依赖服务器重定向,应使用迅睿CMS自带的路由设置(系统 -> URL规则 或 伪静态规则)来匹配旧URL并指向新模块。
在 config/custom.php 中可以添加特定的路由映射逻辑:
// 示例:将旧的详情页URL重定向到新URL
\Phpcmf\Service::C()->on('cms_view', function($data) {
// 逻辑判断...
});
在后台删除文章或栏目时,迅睿CMS通常会提示是否保留生成静态文件。建议在系统设置中开启删除内容时自动生成死链记录(如果插件支持),或者定期运行上述Python脚本进行全站体检,确保死链被及时发现和处理。
易频IT社区是综合性互联网IT技术门户网站,专注分享网络技术、服务器运维、网络安全、编程开发、系统架构、云计算、大数据等行业干货,实时更新IT行业资讯、零基础教程、实战案例,为IT从业者、技术爱好者提供专业的学习交流平台。
Copyright © 2021-2026 易频IT社区. All Rights Reserved. 备案号:闽ICP备2023013482号 网站地图