.htaccess 将旧锚定链接重定向到新锚定链接

.htaccess 将旧锚定链接重定向到新锚定链接,.htaccess,redirect,anchor,.htaccess,Redirect,Anchor,我正在检修一个别人为我的组织建立的网站。它最初是建立在“不太好”的锚链接,其中包括空间。我已经用新的锚替换了那些锚,它们会工作得更好 例如: 其中一个旧锚看起来像这样,浏览器将幸运地转换为/course/#以%20拥有。我把锚改成了:/course/#have 我现在想确保任何可能在社交媒体上共享或可以从其他网站链接到的锚仍然有效;我计划通过.htaccess文件中的重定向来执行此操作,例如: 将301/course/#重定向到%20Have/course/#To have 经过一些研究,我发现

我正在检修一个别人为我的组织建立的网站。它最初是建立在“不太好”的锚链接,其中包括空间。我已经用新的锚替换了那些锚,它们会工作得更好

例如: 其中一个旧锚看起来像这样,浏览器将幸运地转换为
/course/#以%20拥有
。我把锚改成了:
/course/#have

我现在想确保任何可能在社交媒体上共享或可以从其他网站链接到的锚仍然有效;我计划通过.htaccess文件中的重定向来执行此操作,例如:

将301/course/#重定向到%20Have/course/#To have

经过一些研究,我发现这是不可能的,因为URL中有
。我也没有看到一个锚被重定向到另一个锚的例子


这可能吗?

正如我在评论中提到的,这在
.htaccess
中是不可能的

原因是:散列部分(称为片段)实际上没有发送到服务器,因此Apache将无法获取它。服务器只能拾取之前的所有内容,这在的语法部分中有描述

作为替代方案,我建议您在滚动到片段的位置之前使用JavaScript转换片段。您可以通过拉入
[window.]location.hash的值来实现这一点(方形parenthises中的部分是可选的,因为
location
在全局范围中也可用),如下所示:

if(window.location.hash){
//函数“slugify”片段
//@见https://gist.github.com/mathewbyrne/1280286#gistcomment-1606270
var slugify=功能(输入){
返回输入.toString().toLowerCase().trim()
.replace(/\s+/g,'-')//将空格替换为-
.replace(//&/g,'-and-')//替换为'and'
.replace(//[^\w\-]+/g',)//删除所有非单词字符
.replace(/\-\-+/g,'-');//将多个-替换为单个-
}
//现在获取散列并“slagify”它
var hash=slugify(window.location.hash.split(“#”)[1]);
//通过设置它转到新哈希
window.location.hash='#'+hash;
}

是,这在
.htaccess
中是不可能的。但是,您可以使用JavaScript转换哈希值并重定向。或者,更好的方法是,使用JavaScript进行转换,然后简单地找到要滚动到的元素(使用转换后的值)——这可以防止重定向,我认为在这种情况下不需要重定向。谢谢你,迈克。你能告诉我更多关于这件事吗?我不知道如何才能完成你的建议。请看下面我的答案。谢谢你,迈克。对于我上面的例子,这就是我在最后两行要做的吗
var hash=slugify(window.location.hash.split('/course/#To%20Have')[1]);window.location.hash='/course/#具有'+hash
里。谢谢你,迈克。我设法把这个javascript放到了头上(我现在可以在网站的源代码中看到它)!耶!但是,当“重定向”从旧锚点转到新锚点时,页面不会向下滚动到正确的位置(锚点id的实际位置)。这个javascript应该能够滚动到锚点的位置吗?它应该在设置哈希(最后一行)时自动滚动到锚点的位置。也许可以尝试将脚本标记向下移动到
的正上方,这样应该可以修复它。或者,如果您使用的是jQuery,则将代码包装在
$(function(){})
中。啊,它现在可以工作了,没有做任何更改!只需添加代码,包装在
add_action('wp_head','hook_javascript');函数hook_javascript(){$output=“code”echo$output;}
到我的子主题functions.php文件中。非常感谢。