typecho默认使用的是绝对路径,如果博客进行迁移,域名发生改变的话,原来的图片等附件链接如果不是使用图床,会报404错误,原因是作者在这方面使用了绝对路径,网上搜索了很久,都没有找到解决办法,最后还是靠自己搞掂了,下面方法是把绝对路径修改成相对路径的步骤。
1.先把 站点地址 修改成空白
打开 /var/Widget/Options/General.php
文件,在约164行代码处,原代码:
/** 站点地址 */
if (!defined('__TYPECHO_SITE_URL__')) {
$siteUrl = new Form\Element\Text(
'siteUrl',
null,
$this->options->originalSiteUrl,
_t('站点地址'),
_t('站点地址主要用于生成内容的永久链接.') . ($this->options->originalSiteUrl == $this->options->rootUrl ?
'' : '</p><p class="message notice mono">'
. _t('当前地址 <strong>%s</strong> 与上述设定值不一致', $this->options->rootUrl))
);
$form->addInput($siteUrl->addRule('required', _t('请填写站点地址'))
->addRule('url', _t('请填写一个合法的URL地址')));
}
修改成:
/** 站点地址 */
/**
if (!defined('__TYPECHO_SITE_URL__')) {
$siteUrl = new Form\Element\Text(
'siteUrl',
null,
$this->options->originalSiteUrl,
_t('站点地址'),
_t('站点地址主要用于生成内容的永久链接.') . ($this->options->originalSiteUrl == $this->options->rootUrl ?
'' : '</p><p class="message notice mono">'
. _t('当前地址 <strong>%s</strong> 与上述设定值不一致', $this->options->rootUrl))
);
$form->addInput($siteUrl);
}
*/
即把 $siteUrl
后面的删除
这一步是在站点链接选项处允许填入空置,然后到管理后台,设置---》基本---》站点地址,把网站地址删除(留白)并保存
(可选)然后,可以把源代码修改回来,且把整个代码注释掉:
/** 站点地址 */
/**
if (!defined('__TYPECHO_SITE_URL__')) {
$siteUrl = new Form\Element\Text(
'siteUrl',
null,
$this->options->originalSiteUrl,
_t('站点地址'),
_t('站点地址主要用于生成内容的永久链接.') . ($this->options->originalSiteUrl == $this->options->rootUrl ?
'' : '</p><p class="message notice mono">'
. _t('当前地址 <strong>%s</strong> 与上述设定值不一致', $this->options->rootUrl))
);
$form->addInput($siteUrl->addRule('required', _t('请填写站点地址'))
->addRule('url', _t('请填写一个合法的URL地址')));
}
*/
2.修改 pagedown.js 文件
具体位置:/admin/js/pagedown.js
打开后搜索 .replace(/^http:\/\/(https
,然后把后面的
(t = "http://" + t)
修改成:
(t = "" + t)
最后保存即可。
Ctrl+F5 刷新下缓存,本地上传的图片等附件即变成相对路径了。
附:关于这段代码的解析
return e ? t = null : (t = t.replace(/^http://(https?|ftp):///, "$1://"), /^(?:https?|ftp):///
.test(t) || /^[_a-z0-9-]+:/i.test(t) || (t = "http://" + t)), i.parentNode.removeChild(i),
n(t), !1
这段JavaScript代码是一个函数中的一行语句,它包含了条件运算符(ternary operator)和一些逻辑判断。我会逐步解释这段代码的含义:
return e ? t = null : (t = t.replace(/^http:\/\/(https?|ftp):\/\//, "\$1://"), /^(?:https?|ftp):\/\// .test(t) || /^[_a-z0-9-]+:/i.test(t) || (t = "http://" + t)), i.parentNode.removeChild(i), n(t), !1
- 首先,这段代码包含了一个条件运算符
? :
,它的作用是根据条件e
的值来决定返回什么值。如果e
的值为真(truthy),则执行t = null
,否则执行后面的逻辑。 在条件运算符的第二部分,有一系列操作:
t = t.replace(/^http:\/\/(https?|ftp):\/\//, "\$1://")
:这一部分是将t
中以http://
开头的部分替换为匹配到的https?|ftp
,并且保留://
部分。^(?:https?|ftp):\/\//.test(t)
:这一部分是检查t
是否以http://
、https://
或者ftp://
开头。^[_a-z0-9-]+:/i.test(t)
:这一部分是检查t
是否以字母、数字、下划线或连字符开头的协议格式。t = "http://" + t
:如果前面的两个条件都不满足,则在t
前面添加http://
。
- 最后,代码执行了一系列操作后,移除了某个节点
i
,然后调用了函数n(t)
,最终返回了false
。
综合起来,这段代码的作用是根据条件e
的真假对t
进行一系列处理,包括替换http://
开头的部分、检查协议格式,并最终返回处理后的t
值。