ThinkPHP5.1如何在模版中输出public/static静态资源文件的URL路径?

因为这个项目有可能不放在WEB根目录,会放在子目录中,也有可能会经常修改服务器的IP(这个项目在外网和内网都有开放,但是外网和内网开放的URL不同,甚至还做了虚拟目录,这个需求确实有点奇怪),所以不能写死在模版里面

我试过$_SERVER的script_filename,script_name,pathinfo,REQUEST_URI等变量,他们在使用了pathinfo之后,会把pathinfo的信息也带入进去,导致使用dirname获取这些变量所在目录,获取到的并不是真实的index.php所在的public目录的URL

而且也不能通过判断url中的index.php来确定,因为有可能服务器还做了URL重写,不一定在URL中存在index.php这个字符串,不能通过字符串切割来解决。

假如当前页面是192.168.1.1/subDir/index.php/index/admin/test,那么直接在模版里面写static/js/的话会被浏览器解析到192.168.1.1/subDir/index.php/index/admin/test/static/js/上,所以这种方法无效

有什么其他办法能获取public/static静态资源文件的URL路径吗?

我试过直接在模版里面写__STATIC__或者__ROOT__,结果都是直接浏览器里面原样输出

图片描述
图片描述

阅读 10.5k
4 个回答

通过SF.GG官方交流群群友的帮助,最终找到解决方案。

在ThinkPHP的模版配置文件中使用如下配置

'tpl_replace_string'  =>  [
        '__STATIC__'=>$_SERVER['REQUEST_SCHEME'] .'://' . $_SERVER['HTTP_HOST'] . str_replace('/index.php' ,'' ,$_SERVER['SCRIPT_NAME']) . '/static',
    ],

然后在模版中直接使用__STATIC__常量即可,完美适配各种协议,各种子路径,以及带有pathinfo的情况

你可以全局定义一些js变量,像这样把模板变量放进去就好了
clipboard.png

clipboard.png

    // 视图输出字符串内容替换
    'view_replace_str'       => [
        '__ADMIN__'=>'/static/admin',
    ],

在config.php 里加个自定义路径就可以了

clipboard.png

新手上路,请多包涵

两种解决方法:
1.修改服务器 default_server 指向 subDir 目录,ip访问时就不用添加subDir路径,局域网和公网访问方式统一
2.写一个方法针对局域网、公网访问方式做判断,针对两种情况返回不同的host_name

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题