MENU

关于 Typecho 静态资源路径的问题

• November 1, 2016 • Read: 36048 • Codes

前几天有 Mirages 用户告诉我如果不开启伪静态的话,有两个链接会导致404,然后才想起来因为我一直开着伪静态,所以一直忽略了这方面的需求,今天中午刚好有点时间,就尝试解决一下这个问题。

伪静态设置在 Typecho 后台有,选项名称为「是否使用地址重写功能」,翻了翻数据库,发现字段名为rewrite,然后就根据这个字段做了下判断,在没开启地址重写功能的时候自动在链接中补上index.php就可以了。非常简单。

if ($options->rewrite == 0) {
    
}

顺便,想起了前两天看到 Jrotty 的一篇文章:如何为 typecho 站点设置多个域名,是关于带 www 和不带 www 的域名路径的一些问题,可能会导致一些静态文件跨域的问题(虽然我从来没遇到过。。。),但解决方案有好几种,但都会修改配置文件甚至 Typecho 源码。个人认为,这种事在主题层面解决会更好一些。

我个人的解决方案是不使用 $options->siteUrl,而是使用 $options->rootUrl,这样,Typecho 后台的「站点地址」选项的设置就影响不到我们链接的生成,而且,对于文章、分类、评论等 Typecho 自己生成的链接中( $item->permalink() )都是使用的 $options->rootUrl

但是这里有一点问题,就是 $options->themeUrl 使用的是 $options->siteUrl,很多人制作主题的时候会使用它引入静态文件:

<link rel="stylesheet" href="<?php $this->options->themeUrl('style.css'); ?>">

这也是官方主题的做法。除了调用函数,我们还可以直接使用 $options->themeUrl 获取其值,然后对其进行拼接:

<link rel="stylesheet" href="<?= $this->options->themeUrl.'/style.css'; ?>">

所以我们可以对其做一下替换:

define("THEME_URL", rtrim(preg_replace('/^'.preg_quote($options->siteUrl, '/').'/', $options->rootUrl.'/', $options->themeUrl, 1),'/'));

然后就可以使用了:

<link rel="stylesheet" href="<?= THEME_URL ?>/style.css">

目前测试下来一切正常。

以上。

Archives QR Code Tip
QR Code for this page
Tipping QR Code
Leave a Comment

30 Comments
  1. 对了我有个很奇怪的问题,我的iphone可以载入css资源,但是电脑上无法载入css,电脑f12调试吧css链接换成相对路径又可以了。。。这是什么操作

  2. RND RND

    我个人的解决方案是不使用 $options->siteUrl,而是使用 $options->rootUrl,,,这是改哪个文件?

    1. @RND这个 就要看你主题了

    2. RND RND

      @Hran默认安装的主题

  3. 用相对路径,不要用绝对路径的意思吧

  4. 解决问题的能力不错哦, 要是我遇到这些问题,可能就麻烦了。@(吐舌)

  5. '  c0sMx ' c0sMx

    然而是我发现的@(滑稽)

    1. @' c0sMx大佬厉害了@(阴险)

    2. '  c0sMx ' c0sMx

      @Hran@(滑稽)你才是真丶极究大佬

    3. @' c0sMx肚子里没货,所以只能写写这种水货文章\#(喜极而泣)