Cactus主题Search跳转问题的小debug

问题描述:

Search Page上的搜索模块,搜索关键词的时候可以加载出结果,但点击链接跳转的时候出现问题,404代表github pages找不到该页面。

再让我们仔细看一下,原来这里生成的链接是跳转到了/search/页面+文章标题的地址去了,根据我们贫乏的知识,hexo的文章都是放在post目录下的,并不会在任何/search/目录之下。

又去确认了一下,这篇文章本来应该是放在在根目录下,并没有那个/search/路径。

解决:

参考了一下原主题repo下搜索问题的issue

Hexo的search模块都是每个主题自己想办法实现的,有的直接用到了hexo-generator-search这个插件帮忙生成,有的是自己写的,search页面实现搜索功能靠的是js,按理说主题目录/source/js下会有search.js这个文件。打开它,我们可以看到cactus主题的search功能是复用了那个插件的代码。

然后我们逐行检视代码,找到生成url的那一行。

这一行大概就是把搜索结果放到一个列表里面,列表的元素是超链接,超链接的href dataUrl就是我们想改掉的url,这里就有点问题,好像并没有出现预想之内的字符串"/search/"与文章标题url的拼接这样的处理方式,这好像就需要我们直接在dataUrl上做文章。观察上面的代码,dataUrl实际上是data.url这样一个属性,data又是forEach()下遍历的元素,应该是一个对象,对datas这个数组里面的每个data执行花括号定义的function(data)(后面的代码全是function的内容)。观察function里面是没有循环的,所以它想展示所有的只能是对最开始的datas数组遍历(于是猜想datas应该就是文章列表的xml结构数据),这有点像pandas.Columns.apply()函数,这个函数接受另一个函数名的参数,对pandas数据表里该列每个元素执行接受的函数的操作。

再往前看,这段涉及ajax什么的我就看不懂了,但大概是让datas接受某个xmlResponse,这个reponse我们可以想到应该就是所有文章的列表。

这么说好像还是一个黑箱,于是我们直接$hexo -s启动服务器,在localhost:4000/search/本地调试一下,打开safari,⌥+⌘+I (I for inspect)召唤出调试界面,然后找到sources,在输入框里随便输点内容之后,下面就出现了一个search.xml文件,点开看一看,好像的确就是所有文章的feeds。

xml文件的<title>, <url>, <content>几个tag刚好能对应上面赋值给datas的代码,那么,出问题的应该就是xml里面的url了。再仔细观察一下这个url,发现它直接就是这篇博文的md文件标题了,大概就是post-title/这样的形式,在前面没有任何斜杠表示其路径。

到这里其实就明白了,因为在网页中直接点开some-title.file/这样的路径链接的话,重定向其实是直接在当前目录的后面加入这一段的路径作为整体的链接跳转。我们本来在search页面,也就是githubpages.github.io/search/这个路径之下,再点开一个首部没有斜杠的链接就会被定位到githubpages.github.io/search/some_post这里去,而这里什么都没有,所以GitHub pages就给出了404信息。

那解决的办法也很简单。

只要在这里加个斜杠就好了。吐血