博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
如何让php自动进行二级域名泛解析
阅读量:6323 次
发布时间:2019-06-22

本文共 2332 字,大约阅读时间需要 7 分钟。

hot3.png

最近,受朋友委托,帮忙写一套多用户博客系统,要求每一个注册用户根据会员名自动生成二级域名指向,比如:你注册的用户名是:hengbo,主站域名:cycf.org.cn,那这个用户的博客地址是:hengbo.cycf.org.cn;首先我想到的是用泛域名解析,然后修改apache中的虚拟主机绑定,第一步:打开域名解析服务器,添加一条A记录,其中,“主机名”填写“*” ,“指向”填写为自己网站的服务器IP。这样所有*.cycf.org.cn 都指向202.20.88.44 所以不管你申请什么名字,如:chenwenming.cublog.cn 都解析到这个IP上。最主要的是apache的配置了。将所有的虚拟主机段先删除,加入ServerName localhost ServerAlias *UseCanonicalName OFFVirtualDocumentRoot D:/www/%1ServerName在这里不起作用,ServerAlias会将域名解析到D:/www下对应的目录,北京php培训这样就不用每次都修改httpd.conf文件了。需要注意的是使用VirtualDocumentRoot指令需要加载mod_vhost_alias模块,php培训,北京php培训去掉包含mod_vhost_alias行对应的LoadModule和AddModule前面的"#",restart一下apache就OK了试了一下,果然很爽,可以使用VirtualDocumentRoot /www/%2+来实现泛解析,不过不管什么二级域名都被解析到根目录了,*.cycf.org.cn 会被指向 /www/root再想想,于是,可以用VirtualDocumentRoot /www/%2+/%0来实现二级域名分目录,即www.hengboit.com 会被指向 /www/root/www.hengboit.comtest1.cycf.org.cn 会被指向 /www/root/test1.cycf.org.cntest2.cycf.org.cn 会被指向 /www/root/test2.cycf.org.cn剩下的就是我们怎么样用php程序修改这个文件了,每注册一个用户,自动生成一个文件夹,这样就很轻松的实现了每个用户都有一个二级域名怎么?你看不懂吗?呵呵,让我们的apache加载的模块文件怎么实现虚拟目前就可以了,就看我们是怎么修改的了

abc.com的A记录和泛解析都已经指向了同一个空间(空间已支持泛解析)

 

在根目录下有三个目录(www目录,1目录,2目录)

要求如下

1、访问时

此时地址栏显示,实际是http://下的默认文件,如index.php)

 

2、访问时

此时地址栏显示,实际是http://下的默认文件,如index.php)

 

3、访问时

此时地址栏显示,实际是http://下的默认文件,如index.php)

 

4、访问时

此时地址栏显示,实际是http://下的默认文件,如index.php)

环境是 nginx + fastcgi

框架 TP
由于TP是单入口访问模式,这里不得不借助于PHP的动态处理。
假设, 一个域名 example.com 用户二级域名形如 user1.example.com user2.example.com ......
要求以userX.example.com 访问的时候,绑定到 member 模块下的 index 方法。
首先,在nginx中需要如下配置:

  1. server{

  2.     listen 80;

  3.     #server_name泛解析绑定

  4.     server_name *.example.com;

  5.     if ( $host ~ ^(.+).example.com ) {

  6.         #从域名中提取出用户名,设置为$user变量,下文使用

  7.         set $user $1;

  8.         #将模块名和操作名通过get参数指定,这样TP那边就不会根据pathinfo去重新解析模块操作名,将用户名通过 user参数指定,在tp中处理。

  9.         rewrite (.*) $1?m=member&a=index&user=$user break;

  10.     }

  11.  }

复制代码

TP中 /member/index 下,通过

$user=$_GET['user'];//获取用户名

 //根据用户名取该用户的数据,过程省略。

 ....

复制代码

访问
http://user1.example.com/ftype/1
实际上等于
http://user1.example.com/ftype/1?m=member&a=index&user=user1
这里有个ftype额外的参数,可以通过tp的route路由处理
路由规则如下:
"ftype/([^\/])+" => "member/index?ftype=:1"
TP处理后,
会自动将 ftype参数合并到$_GET中,直接在member/index 中通过$_GET['ftype'] 调用即可。
url等价于
http://user1.example.com/index.php?m=member&a=index&user=user1&ftype=1
当然,在3.X版本中,也许还可以通过$ftype=$_GET["_URL_"][1]; 来取得,就不要路由了。我个人不太推荐这种办法,如果ftype在url中的位置发生变化,将取不到值。
以上是我个人的一点探索,如果谁有更好的解决方案,请务必不吝赐教,谢谢!

转载于:https://my.oschina.net/yonghan/blog/524852

你可能感兴趣的文章
针对Kubernetes软件栈有状态服务设计的思考
查看>>
第八章 进程间通信
查看>>
CentOS 7 巨大变动之 firewalld 取代 iptables
查看>>
教你如何使用Flutter和原生App混合开发
查看>>
订单的子单表格设置颜色
查看>>
lvs fullnat部署手册(三)rs内核加载toa篇
查看>>
iframe 在ie下面总是弹出新窗口解决方法
查看>>
android编译系统makefile(Android.mk)写法
查看>>
MD5源代码C++
查看>>
Eclipse 添加 Ibator
查看>>
Linux中变量$#,$@,$0,$1,$2,$*,$$,$?的含义
查看>>
十四、转到 linux
查看>>
男人要内在美,更要外在美
查看>>
为什么要跟别人比?
查看>>
app启动白屏
查看>>
Hadoop集群完全分布式安装
查看>>
QString,char,string之间赋值
查看>>
MySql之基于ssl安全连接的主从复制
查看>>
informix的逻辑日志和物理日志分析
查看>>
wordpress admin https + nginx反向代理配置
查看>>