关于Smarty模板文件里相对路径的问题

时间:2022-09-14 09:18:21
我在模板文件里面,加上<img src="../images/aa.jpg">或者<form actino="../login.php">等相对路径,为什么最后这些还是在当前目录下?这些"../"都不起作用了

我的文档目录
webroot
    images/
    admin/index.php
    login.php

我是在admin/index.php里面,包含模板文件,但是,最后网页代码里,这些"../"不起作用,<img src="../images/aa.jpg">变成<img src="images/aa.jpg">,但是 ,我写成<img src="....//images/aa.jpg">,最后结果却是对的,<img src="../images/aa.jpg">

想问一下,Smarty模板对于文件里的相对路径,是怎么处理的?

8 个解决方案

#1


相对路径相对的是php文件所在的目录,不是模板所在目录

#2


"../{$images}/aa.jpg">

$tpl->assign('images','实际路径...') ;

我是用这个带变量的路径解决的。

#3


谢谢,带变量的方式,我明白了,
但是,为什么smarty模板,对于模板文件里的 "../" 这种相对路径会忽略掉呢?

#4


并没有忽略,
tpl模板的路径和用来输出模板的php路径是不一样的,
当前路径是以正在执行的php文件为准。

#5


是啊,我当前路径为 webroot/admin/index.php 要引用的图片路径是webroot/images/ 我在模板文件中,用,<img src="../images/aa.jpg">,不管我在路径前加几个 "../",最后出来的图平路径,都是从 webroot/admin/images/aa.jpg,而到不了webroot/images/aa.jpg,看输出的html文件里,代码变成,<img src="images/aa.jpg">,也就是我用的"../"不起作用

#6


看一下template_c中编译后的文件就知道了

#7


注意你的webroot的目录,
前几天我也遇到类似问题,
后来发现是图片文件都放到webroot的上一级目录了,就没法调用了,

#8


呵呵,谢谢大家,很久没来,我知道怎么回事了,因为原来的程序不是我写的,所以不太明白,后来发现了下面的代码:

$tpl->register_outputfilter("ChangePath");

有下面的函数定义
function ChangePath($buffer,&$tpl) 
{
  return (preg_replace("/\.\.\//", "", $buffer));
}

原来编译后的程序把 ../ 过滤了,怪不得我用“....//” 可以起作用。

#1


相对路径相对的是php文件所在的目录,不是模板所在目录

#2


"../{$images}/aa.jpg">

$tpl->assign('images','实际路径...') ;

我是用这个带变量的路径解决的。

#3


谢谢,带变量的方式,我明白了,
但是,为什么smarty模板,对于模板文件里的 "../" 这种相对路径会忽略掉呢?

#4


并没有忽略,
tpl模板的路径和用来输出模板的php路径是不一样的,
当前路径是以正在执行的php文件为准。

#5


是啊,我当前路径为 webroot/admin/index.php 要引用的图片路径是webroot/images/ 我在模板文件中,用,<img src="../images/aa.jpg">,不管我在路径前加几个 "../",最后出来的图平路径,都是从 webroot/admin/images/aa.jpg,而到不了webroot/images/aa.jpg,看输出的html文件里,代码变成,<img src="images/aa.jpg">,也就是我用的"../"不起作用

#6


看一下template_c中编译后的文件就知道了

#7


注意你的webroot的目录,
前几天我也遇到类似问题,
后来发现是图片文件都放到webroot的上一级目录了,就没法调用了,

#8


呵呵,谢谢大家,很久没来,我知道怎么回事了,因为原来的程序不是我写的,所以不太明白,后来发现了下面的代码:

$tpl->register_outputfilter("ChangePath");

有下面的函数定义
function ChangePath($buffer,&$tpl) 
{
  return (preg_replace("/\.\.\//", "", $buffer));
}

原来编译后的程序把 ../ 过滤了,怪不得我用“....//” 可以起作用。