前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Apache的DOCUMENT_ROOT坑,第二次踩

Apache的DOCUMENT_ROOT坑,第二次踩

作者头像
horsley
发布2022-08-16 11:21:39
6090
发布2022-08-16 11:21:39
举报

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

某系统过两天要交付,我这边在测试各种情况,在测试把系统部署到子目录的时候发现跳转有问题,然后追查到一个自己写的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函数)。有时候感觉那样不方便,例如你要拼接一个目录和文件名,你还得目录名 + ‘/文件名’,要自己显式加上前面斜杠。但是其实这样的做法是比较能统一的,都是前有杠后没有杠,表示文件名和目录都能统一,如果改成前后都有杠可能造成目录拼接出现双斜杠,如果前面没有杠后面有杠又变成相对路径。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2013 年 11 月,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
轻量应用服务器
轻量应用服务器(TencentCloud Lighthouse)是新一代开箱即用、面向轻量应用场景的云服务器产品,助力中小企业和开发者便捷高效的在云端构建网站、Web应用、小程序/小游戏、游戏服、电商应用、云盘/图床和开发测试环境,相比普通云服务器更加简单易用且更贴近应用,以套餐形式整体售卖云资源并提供高带宽流量包,将热门开源软件打包实现一键构建应用,提供极简上云体验。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档