操作系统:windows
浏览器:Firefox 搜狗浏览器
问题描述:在PHP的代码中使用预定义常量DIRECTORY_SEPARATOR来组成链接的href跳转路径。在不同的浏览器下,可能会出现问题
工作代码如下:
图1-1
对于此段跳转代码
搜狗浏览器在当鼠标指针移动到链接上时,左下角显示的地址
点击可以成功跳转
但是FF浏览器在其链接地址却是
点击跳转会出错误
所以,盲目使用DIRCTORY_SEPARATOR拼接跳转路径也会出错,DIRECTORY_SEPARATOR在使用时可能也会因浏览器的不同而不同。
总结项目中需要用到路径的地方
1. <a href=””></a> ,<img src=””/> , header(“Location: ”) 这些地方要使用文件系统相对路径(域内跳转)或者绝对URI(跨域跳转)(不过使用绝对URI那么本地调试不好弄),以兼容浏览器的差异
2. 对于reuqire(), include(), require_once(), include_once() 等则要使用文件系统绝对路径(结合__FILE__, __DIR__等),因为如果使用相对路径的话,在此种情况下会出错误。测试代码结构如下:
/test
|--aa.php
/--subTest
|--bb.php
|--cc.php
其中aa.php 使用相对路径包含bb.php,bb.php使用相对路径包含cc.php
直接访问aa.php,会出现找不到cc.php的情况,因为系统是按照aa.php的相对位置去包含cc.php的
aa.php代码如下
<span style="font-family:Courier New;font-size:12px;"> <?php
<span style="white-space: pre;"> </span>echo 'here is aa.php <br />';
<span style="white-space: pre;"> </span> require './subTest/bb.php';
?></span>
bb.php代码如下
<span style="font-family:Courier New;"><?php
<span style="white-space: pre;"> </span>echo 'here is bb.php <br/>';
<span style="white-space: pre;"> </span>require './cc.php';
?></span>
cc.php代码如下
<span style="font-size:14px;"><?php
<span style="white-space:pre"> </span>echo 'here is cc.php';
?></span>
直接访问bb.php结果如下
图1-3
访问aa.php结果如下:
图1-4
3. 不使用预定义常量DIRECTORY_SEPARATOR,而使用’/’恒作为目录分隔符,因为其在linux系统下和windows下是兼容的
4. 不同浏览器下<a>标签的href属性、<img>的src以及header(“Location:XXX”)的XXX部分,以’/’开头,得到的实际路径可能不一样
所以最好采用相对路径(以 './' 或者 '../'开头)
5. 最后要注意的是,虽然DIRECTORY_SEPARATOR不能用在拼接跳转url上,但是对于不同的环境(或操作系统,或浏览器),要在其中将__FILE__或
__DIR__使用explode()将路径分拆为目录(或文件数组)时,则必须使用DIRECTORY_SEPARATORY。使用'/',在Firefox下explode __FILE__和__DIR__会得不到想要的结果,因为Firefox目录分割符貌似是'\'。所以,正确分解方法是explode(DIRECTORY_SEPARATORY, __FILE__)