含片段#的WordPress旧URL重定向失效问题求助
带URL片段(#)的旧链接重定向解决方案
首先明确核心问题:URL里的#(锚点片段)是浏览器端处理的内容,不会发送给服务器,所以Yoast这类服务器端重定向工具根本接收不到#后面的部分,自然无法触发重定向。下面给你三种可行的解决方式:
一、通过WordPress的functions.php实现
利用前端JS检测URL的hash部分,在页面加载时完成跳转,具体代码如下:
add_action('wp_head', 'redirect_old_hash_press_releases'); function redirect_old_hash_press_releases() { // 只在目标页面(比如/en/media/对应的页面)执行,替换成你的页面slug或ID if (is_page('media')) { ?> <script> // 获取hash并去掉开头的# const urlHash = window.location.hash.slice(1); // 匹配旧链接的hash格式:/pressreleases/开头的路径 if (urlHash.startsWith('/pressreleases/')) { // 构造新的目标URL,替换成你实际的新页面路径 const newRedirectUrl = `https://www.example.com/new-press-release-section${urlHash}`; // 301永久重定向,replace不会留下历史记录 window.location.replace(newRedirectUrl); } </script> <?php } }
把这段代码添加到主题的functions.php文件(或使用代码片段插件),它会在指定页面的头部插入JS脚本,浏览器加载后自动检测hash并跳转。
二、Cloudflare配置方案
Cloudflare可以直接获取到客户端的完整URL(包括hash),有两种配置方式:
1. 页面规则(Page Rules)快速配置
- 登录Cloudflare后台,进入域名的「规则」→「页面规则」
- 创建新规则,匹配URL填:
https://www.example.com/en/media/#/pressreleases/* - 规则动作选择「转发URL」,类型设为「301永久重定向」,目标URL填:
https://www.example.com/new-target-path/$1($1会自动替换*匹配到的文章标题部分) - 保存规则,等待1-5分钟生效
2. Workers脚本(更灵活)
如果页面规则的匹配逻辑不够精准,用Cloudflare Workers写自定义脚本:
addEventListener('fetch', event => { event.respondWith(handleRedirect(event.request)) }) async function handleRedirect(request) { const currentUrl = new URL(request.url); // 匹配目标路径和hash格式 if (currentUrl.pathname === '/en/media/' && currentUrl.hash.startsWith('#/pressreleases/')) { // 提取hash部分并去掉# const targetPath = currentUrl.hash.slice(1); // 构造新URL,替换成你的实际目标地址 const newUrl = new URL(targetPath, currentUrl.origin); // 返回301重定向 return Response.redirect(newUrl, 301); } // 其他请求正常放行 return fetch(request); }
部署这个脚本到Cloudflare Workers,并绑定到你的域名路径即可。
三、WP Engine相关配置
WP Engine的服务器端规则无法处理URL片段(因为服务器拿不到hash),但可以通过以下方式配合:
- 使用WP Engine的「Custom Code」功能,添加和上面functions.php里一样的前端JS代码,作用和直接修改functions.php一致
- 如果你开启了WP Engine的CDN,可参考Cloudflare的页面规则逻辑,在CDN配置里设置类似的URL转发规则(但WP Engine CDN的规则灵活性不如Cloudflare,优先推荐前两种方法)
内容的提问来源于stack exchange,提问作者RP-90
相关产品推荐
相关产品推荐

