您现在的位置是:休闲 >>正文

thinkphp获取域名

休闲62379人已围观

简介在 ThinkPHP 里拿域名,最直接的方式是走 Request 对象。不管你是 5.x 还是 6.x,核心思路都一样:框架已经把 HTTP 请求封装好了,你只需要调对应的方法就行。别自己去拼 $_S ...

在 ThinkPHP 里拿域名,域名最直接的域名方式是走 Request 对象。不管你是域名 5.x 还是 6.x,核心思路都一样:框架已经把 HTTP 请求封装好了,域名你只需要调对应的域名方法就行。别自己去拼 $_SERVER['HTTP_HOST'],域名虽然那样也能跑,域名但 ThinkPHP 的域名 Request 类处理了端口、协议、域名代理这些乱七八糟的域名情况,省心得多。域名

先看一段实际代码。域名假设你在控制器里:

use think\Request; public function index(Request $request) {  $domain = $request->domain(); echo $domain; // 输出类似 https://www.example.com } 

这里 domain() 返回的域名是带协议头的完整域名。如果你只想要 www.example.com 这种不带协议的域名部分,用 $request->host()。域名注意 host() 默认会带上端口号,比如 www.example.com:8080。不想要端口的话,传个 true 进去:$request->host(true),这样端口就被剥掉了。

有人可能会问:如果网站挂在 CDN 或者反向代理后面,domain() 拿到的会不会是内网 IP?这个问题确实存在。ThinkPHP 的 Request 类会检查 HTTP_X_FORWARDED_HOST 和 HTTP_X_FORWARDED_PROTO 这些头,但前提是代理服务器正确设置了它们。Nginx 做反代时通常要加:

proxy_set_header Host $host; proxy_set_header X-Forwarded-Proto $scheme; 

少了这两行,框架拿到的就是后端服务器的地址,域名自然不对。我见过有人折腾半天以为是 ThinkPHP 的 bug,结果问题出在 Nginx 配置上。

再来说子域名的情况。比如 blog.example.com,domain() 返回完整子域名,这没什么好说的。但如果你想单独提取顶级域名 example.com,ThinkPHP 没提供现成方法,得自己处理。一个粗糙但够用的写法:

$host = $request->host(true); $parts = explode('.', $host); $count = count($parts); if ($count > 2) {  $topDomain = $parts[$count - 2] . '.' . $parts[$count - 1]; } else {  $topDomain = $host; } 

这段代码对 .com.cn 这类二级后缀会出错,比如 example.com.cn 会被截成 com.cn。真要精确处理,得引入公共后缀列表,那就是另一个话题了。日常项目里如果只是简单判断,上面这个够用。

还有个容易踩的坑:在命令行模式下跑 ThinkPHP 的定时任务或者队列时,Request 对象里的域名信息是空的。因为 CLI 没有 HTTP 请求上下文。$request->domain() 会返回空字符串,甚至报错。这时候要么从配置文件读域名,要么手动构造一个 Request 实例。我一般会在 config/app.php 里加一个 base_domain 配置项,CLI 和 Web 环境都从那里取,逻辑统一,少出岔子。

模板里想用域名也简单。ThinkPHP 的模板引擎支持在视图中直接调 Request 方法,不过更常见的做法是在控制器里 assign 过去:

$this->assign('domain', $request->domain()); 

然后在模板里 { $domain} 就完事了。别在模板里写 { :request()->domain()},虽然能跑,但把逻辑塞进视图层,后期维护会难受。

最后提一个实际项目里的观察:很多人在本地开发时用 localhost:8000,domain() 返回 http://localhost:8000,然后拼链接发给别人测试,别人当然打不开。这种问题跟框架无关,但频繁发生。我的习惯是本地也配一个假域名,比如 dev.example.test,hosts 文件里指到 127.0.0.1,这样域名相关代码从开发到上线行为一致,少很多意外。

获取域名这件事本身不复杂,ThinkPHP 提供的接口足够用。真正花时间的往往是代理配置、CLI 环境和本地开发习惯这些外围因素。把这几处理顺了,域名处理就不会再成为调试时的干扰项。

Tags:

上一篇:如何玩flash网页游戏

下一篇:teaiapp事件

相关文章

  • 渗透基于

    休闲

    凌晨三点,我盯着屏幕上的一个登录框。那是个老旧的后台系统,连HTTPS都没有。同事说这客户预算有限,能跑就行。 我随手输了几个弱口令,admin/admin,居然进去了。下一秒我退出来,截图,发到项目 ...

    【休闲】

    阅读更多
  • 穿透图怎么做

    休闲

    穿透图这名字听着玄乎,其实就是把“从外到里看”这件事画出来。我见过最直观的例子,是修车师傅用的爆炸图——零件像被炸开一样悬浮着,每个螺丝都在它该在的位置上悬着。那就是穿透图的雏形。 做穿透图的第一步, ...

    【休闲】

    阅读更多
  • 锋钢切肉刀切菜刀

    休闲

    我家厨房抽屉最底层压着的那把老式锋钢切肉刀,是2015年从旧货市场淘来的。刃口崩了两处,刀身满是划痕,柄是硬杂木的,被油浸得发黑。摊主要价十五块,我给了二十,他找了我五块,还搭了句“这刀能砍骨头,你回 ...

    【休闲】

    阅读更多


友情链接