基于模式的Apache重定向规则:子域名点转横杠跳转需求
Apache VirtualHost 子域名重定向配置
需求说明
将所有*.admin.example.com格式的请求重定向到*-admin.example.com,替换子域名中的点为横杠,同时完整保留原URL的路径、查询参数等内容。例如:
abc.def.admin.example.com/path?foo=bar→abc-def-admin.example.com/path?foo=bartest.admin.example.com→test-admin.example.com
配置方案(Apache 2.4+)
确保启用mod_rewrite模块
- Debian/Ubuntu系统执行:
sudo a2enmod rewrite,然后重启Apache:sudo systemctl restart apache2 - CentOS/RHEL系统检查模块状态:
httpd -M | grep rewrite,若未启用则编辑httpd.conf添加LoadModule rewrite_module modules/mod_rewrite.so,再重启服务:sudo systemctl restart httpd
- Debian/Ubuntu系统执行:
编辑VirtualHost配置
在对应的虚拟主机配置块中添加以下规则:<VirtualHost *:80> ServerName admin.example.com ServerAlias *.admin.example.com # 启用重写引擎 RewriteEngine On # 匹配子域名并替换点为横杠后重定向 RewriteCond %{HTTP_HOST} ^(.*)\.admin\.example\.com$ [NC] RewriteRule ^(.*)$ http://${join:-|%split:.|%1}-admin.example.com$1 [R=301,L] </VirtualHost>
规则解释
ServerAlias *.admin.example.com:匹配所有以admin.example.com结尾的子域名请求RewriteCond %{HTTP_HOST} ^(.*)\.admin\.example\.com$ [NC]:捕获admin.example.com前缀的子域名部分(如abc.def),[NC]表示不区分大小写${split:.|%1}:将捕获的子域名按点分割为字符串数组${join:-|...}:将分割后的数组用横杠拼接成新的前缀[R=301,L]:发送301永久重定向响应,L表示终止后续重写规则处理
HTTPS适配
若使用HTTPS,将虚拟主机端口改为*:443,并添加SSL相关配置:
<VirtualHost *:443> ServerName admin.example.com ServerAlias *.admin.example.com SSLEngine On SSLCertificateFile /path/to/your/cert.pem SSLCertificateKeyFile /path/to/your/key.pem RewriteEngine On RewriteCond %{HTTP_HOST} ^(.*)\.admin\.example\.com$ [NC] RewriteRule ^(.*)$ https://${join:-|%split:.|%1}-admin.example.com$1 [R=301,L] </VirtualHost>
注意事项
- 测试前请清除浏览器缓存,避免301重定向缓存影响结果
- 若使用Apache 2.2及以下版本,
split和join函数不支持,需改用循环替换的方式处理点:
注:此方法仅能处理有限数量的点,若子域名中点的数量较多,建议升级Apache版本。RewriteEngine On RewriteCond %{HTTP_HOST} ^(.*)\.admin\.example\.com$ [NC] # 循环替换子域名中的所有点为横杠 RewriteCond %1 ^(.*)\.(.*)$ RewriteRule ^(.*)$ http://%1-%2-admin.example.com$1 [R=301,L,E=NEW_HOST:%1-%2] RewriteCond %{ENV:NEW_HOST} ^(.*)\.(.*)$ RewriteRule ^(.*)$ http://%1-%2-admin.example.com$1 [R=301,L,E=NEW_HOST:%1-%2]
内容的提问来源于stack exchange,提问作者Kharbat
相关产品推荐
相关产品推荐

