分享免费的编程资源和教程

网站首页 > 技术教程 正文

批量二级域名自动访问子目录 - apache重写(rewrite)

goqiw 2025-05-15 17:51:35 技术教程 1 ℃ 0 评论

#可直接看最后的解决方案(找前辈网发布并测试通过)

场景:

比如访问xxx.abc.com,则自动获取www.abc.com/xxx相关页面

且需要不重启apache,需要多少二级域名,自动生效。

网上参考方案:

参考1:
https://www.oschina.net/question/149143_2274346(不生效)

主要代码:

RewriteCond %{HTTP_HOST} !^www.xxxxxx.com$
RewriteCond %{HTTP_HOST} !^m.xxxxxx.com$
RewriteCond %{HTTP_HOST} ^(.*).xxxxxx.com$
RewriteCond %{REQUEST_URI} !^/%1/ 
RewriteRule ^(.*)?$ /%1/$1

参考2:
https://bbs.csdn.net/topics/350153809(不生效)

主要代码:

a、

rewriteengine on
rewritecond %{HTTP_HOST} [^.]+\.域名\.com$
rewriterule ^(.+)$ %{HTTP_HOST}$1 [C]
rewriterule ^([^.]+)\.域名\.com(.*)$ /$1$2

b、

RewriteEngine On
RewriteCond %{HTTP_HOST} ^([a-zA-Z0-9]+)\.域名\.com$
RewriteCond %{REQUEST_URI} !^/[a-zA-Z0-9]/ 
RewriteRule ^(.*)$ /%1/$1 [L]

c、

RewriteCond %{HTTP_HOST} ^www.xxx.com:8080$ 
RewriteRule ^/?$ /index.html 
RewriteCond %{HTTP_HOST} ^[a-zA-Z0-9]+\.xxx.com:8080$ 
RewriteRule ^/?$ /%{HTTP_HOST} 
RewriteRule ^/([a-zA-Z0-9]+)\.xxx\.com:8080/?$ /$1/index.jsp 
RewriteCond %{HTTP_HOST} ^[a-zA-Z0-9]+\.xxx.com:8080/^[a-zA-Z0-9]+\.jsp$ 
RewriteRule ^/?$ /%{HTTP_HOST} 
RewriteRule ^/([a-zA-Z0-9]+)\.xxx\.com:8080/^(.*)?$ /$1/$3\.jsp [L]

apache官方文档:


https://httpd.apache.org/docs/2.4/rewrite/vhosts.html(看不太懂,测试也并不可行)

Setup automatic per-folder subdomains on your local linux based computer,经过测试,完全可行。但是要额外启用vhost_alias模块(看不太懂,没测试)

Redirecting subdomains to directories in apache,这应该是最接近我本意的解决方案了,但是没搞成功,但是看起来挺靠谱的(看不太懂,没测试)

最后给出真正的方案:

准备:

本方案基于centos 6.4

1、host文件夹->www.xxx.cn

2、abc文件夹->abc.host.xxx.cn

具体方案:

1、你需要做泛域名解析

原因:没有泛域名解析,那么你搞的二级域名根本就没法在公网上访问。

方法:在域名解析出,添加*指向你的主机

2、你需要做别名(泛)

原因:你不在apache上做别名,那么apache根本就得不到你的访问请求,或者说对于你的二级域名访问根本无法定位文件夹。

方法:直接贴代码

<VirtualHost *:80>
 DocumentRoot "/usr/www/host"
 ServerAlias *.host.xxx.cn
 <Directory "/usr/www/host">
 AllowOverride all
 Order allow,deny
 allow from all
 </Directory>
</VirtualHost>

3、打开httpd.conf的别名、重写等模块,开启AllowOverride all

上边做好了,需要重启httpd,centos 6.4的重启方法是service httpd restart

4、重写规则

这儿网上给了一大堆方案,实际能用的,至少在百度上找前辈网没发现。

代码如下:

RewriteEngine On
#先适配域名是否有XXX.host.xxx.cn这种形态
RewriteCond %{HTTP_HOST} ([a-z]{3,20})\.host\.xxx\.cn
#再把适配完域名后边的部分给适配出来
RewriteCond %{REQUEST_URI} !/([a-z]{3,20})/(.*)
#找前辈网提醒你,%1指的是第三行([a-z0-9]{3,20})中的内容
#$1指的是rule中(.*),中的所有
#整个的意思
RewriteRule ^(.*)$ /$1/%1

保存为.htaccess放在host文件夹下

最终效果:

访问abc.host.xxx.cn会直接调用 abc.host.xxx.cn/abc下的

需要解决的问题:

1、禁止用户用子目录方式访问,访问则跳转到二级域名

2、其他

我是怎么搞出来的

作为找前辈的一名老师,当然是需要站在一堆复制粘贴博主的肩膀上,想出来的。

首先,想找到写好的方案,基本都出错有问题。

接着,查到泛域名解析

接着,查到别名

接着,自己分析重写规则

最后,分析别人的重写规则,写出这个规则

总结:

难道你们抄代码的时候,真的测试通过了吗?

而你们整出来的,真就那么懒不写个教程吗?

写了教程,难道百度真的是瞎吗?

其他问题请下头评论吧

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表