Apache的DOCUMENT_ROOT坑,第二次踩

现在写代码很多东西可以从以前写的里面拿来重用,有种渐入佳境的感觉。

某系统过两天要交付,我这边在测试各种情况,在测试把系统部署到子目录的时候发现跳转有问题,然后追查到一个自己写的url函数,之前我写的这两个函数用于获取基于web根目录的子目录信息和url。这个东西比较常用,例如要html模板里面要引入css/js等资源的时候,相对路径是个不好的实践,特别是现在各种friendly url之下,相对路径很容易乱套,写绝对路径的话,你得确保部署环境,总归不方便,要是被别人部署到子目录然后你的资源引用路径有前面斜杠的话,dead。

好吧还是先上代码,下面是已经改好的版本。

这两个函数到处都能用,例如在模板里面我会这样用<?php echo get_baseurl()?>/static/css/xxx.css,redirect的时候也可以用。然后回到题目,坑在哪里呢?

坑就在于服务器配置,关于DOCUMENT_ROOT,参看这里,官方文档说DocumentRoot的设定应该不要有末尾斜杠,但是很多wamp傻瓜包(已知wamp、phpnow)的虚拟主机设置都会有末尾斜杠,在计算basedir的时候我用dirname($_SERVER[‘SCRIPT_FILENAME’]) 减去$_SERVER[‘DOCUMENT_ROOT’] 来获取相对web根目录的子目录路径,如果DocumentRoot配置值末尾有斜杠,会直接导致$_SERVER[‘DOCUMENT_ROOT’]末尾有斜杠,然后导致相减之后得到的子目录路径没有前面的斜杠。于是在跟别的东西(例如域名)拼合的时候导致粘结,出来例如abc.comindex.php的效果。

然后今年一月份别的系统已经有人用wamp踩过坑,我才关注到这个问题,但是后来别的项目又直接拷贝这两个函数去用,又一次踩到坑,所以在这里记录一下,现在get_basedir函数增加了前面斜杠的检查,他的行为应该能符合注释描述。

然后最后谈一下斜杠问题,从linux的标准来看,表示文件夹路径都是用的前面有斜杠后面没斜杠的格式(例如pwd看看,或者php的dirname函数)。有时候感觉那样不方便,例如你要拼接一个目录和文件名,你还得目录名 + ‘/文件名’,要自己显式加上前面斜杠。但是其实这样的做法是比较能统一的,都是前有杠后没有杠,表示文件名和目录都能统一,如果改成前后都有杠可能造成目录拼接出现双斜杠,如果前面没有杠后面有杠又变成相对路径。

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注