概述
本章,您将学习到 Apache httpd 的重定向功能。
重定向:也称域名跳转,指当用户通过浏览器访问 A 站点时自动跳转到 B 站点。出现重定向的原因有很多,如:
- 正常情况
- 旧域名需要迁移到新域名
- SEO 优化
- 域名注册商提供的域名转发功能
- Web 服务器设置了域名跳转
- CDN 厂商配置了跳转规则
- 域名到期后被交易平台抢注
- 非正常情况
- DNS 污染
- ISP 或 运营商劫持
- 浏览器有劫持插件
从 HTTP 响应状态码来看,重定向主要有两个:
- 301 - 请求资源的 URL 已永久更改。在响应中给出了新的 URL。
- 302 - 请求资源的 URI 已被暂时更改。未来可能会对这个 URI 做进一步的变更。
相关术语说明
- Hostname - 它用于唯一标识 LAN(局域网)内的设备或作为域名的一部分(例如 "docs")
- Domain name - 狭义概念上的 "域名" 是一种连接各级域并以主机名或服务名开头的结构,用于唯一标识 WAN(广域网)上的资源或设备。例如
docs.rockylinux.org,其中rockylinux.org是该域名的域(Domain)部分。
注意!
在日常交流中,"注册域名" 通常指代的是 "注册一个域(Domain)",而非严格意义上的 "域名(Domain Name)"。
- Domain - DNS 层级结构中的命名空间,不等同于 "域名" 本身
- FQDN(Fully Qualified Domain Name,全限定域名) - 由主机名和各层级域组成的完整域名。根据 RFC 标准(RFC 1034、RFC 2181、RFC 8499),末尾的根域是行业标准(例如
docs.rockylinux.org.),这种标准的写法在行业中被称为 "绝对 FQDN(Absolute FQDN)"。在某些 DNS 开源软件的配置文件中,就要求必须输入标准的绝对 FQDN。但在访问某些网络资源时,可以忽略根域(例如,当用户访问https://docs.rockylinux.org时,浏览器会自动在末尾添加一个点)。
表述准确性
一般来说,"FQDN" 的含义比 "Domain name" 更准确,因为不同行业的读者对 "Domain name" 一词有不同的理解。例如,对于
rockylinux.org,一些读者可能会将其理解为 "Domain name",这正确也不正确,严格来说,它应该被称为域(Domain)而不是域名(Domain name)。因此,在技术文档或运维规范中,应严格区分 "域" 与 "域名",并优先使用 FQDN 以保证语义准确性。对于
docs.rockylinux.org. 的说明如下:
-
Root Domain - DNS 层次结构的顶点,用一个点 (
.) 来表示。RFC 标准规定 -
Domain - DNS 层级中的命名空间,不等同于 "域名" 本身。例如
rockylinux.org. -
Domain name - 严格意义上等同于 FQDN,用于唯一标识 WAN(广域网)上的资源或设备
-
FQDN - 由主机名 + 各层级域构成
-
Top-Level Domain (TLD) - 常翻译为 "顶级域",在不同的语境中有三套不同的标准:
- 在 DNS 协议或 DNS zone 或 FQDN 语境中 - 采用后缀点形式,指代的是
org.这部分 - 在 ICANN/IANA 或注册语境中 - 采用前缀点形式,指代的是
.org这部分 - 在裸 Label 语境中 - 不包含点的字符串,指代的是
org字符串
- 在 DNS 协议或 DNS zone 或 FQDN 语境中 - 采用后缀点形式,指代的是
-
Second-Level Domain (SLD) - 常翻译为 "二级域",在不同的语境中有三套不同的标准:
- 在 DNS 协议或 DNS zone 或 FQDN 语境中 - TLD 下的第一个标签,指代的是
rockylinux这一标签 - 在 ICANN/IANA 或注册语境中 - 指代的是
rockylinux.org这部分 - 在裸 Label 语境中 - 指
rockylinux字符串
- 在 DNS 协议或 DNS zone 或 FQDN 语境中 - TLD 下的第一个标签,指代的是
-
Subdomain - 泛指在某个父域之下自行创建的更低层级的域,在不同的语境中有三套不同的标准:
- 在 DNS 协议或 DNS zone 或 FQDN 语境中 - 指代的是
docs这一标签 - 在 ICANN/IANA 或注册语境中 - 指代的是
docs.rockylinux.org这部分 - 在裸 Label 语境中 - 指
docs字符串
- 在 DNS 协议或 DNS zone 或 FQDN 语境中 - 指代的是
-
Hostname - FQDN 最左侧的字符串,指
docs这台主机
重定向演示
需求:HTTP 状态码为 301 的重定向,要求从 www.reada.org 跳转到 www.books.com
配置两个 Web 站点
涉及到两个网站,因此虚拟主机是必需的。由于这里的域名都是假设的,因此还需要自行搭建 DNS 服务器。
| 角色 | 操作系统 | IP 地址 |
|---|---|---|
| DNS 服务器 | RL 10.2 | 192.168.100.21/24 |
| Web 服务器 | RL 8.10 | 192.168.100.20/24 |
配置 DNS 服务器:
Shell > dnf5 -y install bind
# 主配置仅更改这两项
## 主配置文件包含了区域文件 /etc/named.rfc1912.zones
Shell > vim /etc/named.conf
options {
listen-on port 53 { 192.168.100.21; };
...
allow-query { any; };
...
include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";
# 然后是配置区域文件 /etc/named.rfc1912.zones
## 将默认内容注释掉(利用 vim 的底线命令模式注释掉,如 ":set nu",":17,$ s/^/#/g")
Shell > vim /etc/named.rfc1912.zones
zone "reada.org" IN {
type primary;
file "named.reada";
allow-update { none; };
};
zone "books.com" IN {
type primary;
file "named.books";
allow-update { none; };
};
# 配置数据解析文件
## bind 提供了一个默认的 /var/named/named.localhost 正向解析文件,可复制并另外重命名该文件进行配置
Shell > cp -p /var/named/named.localhost /var/named/named.reada
Shell > vim /var/named/named.reada
$TTL 1D
@ IN SOA reada.org. rname.invalid. (
0 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
NS dns.reada.org.
dns A 192.168.100.21
www A 192.168.100.20
Shell > cp -p /var/named/named.localhost /var/named/named.books
Shell > vim /var/named/named.books
$TTL 1D
@ IN SOA books.com. rname.invalid. (
0 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
NS dns.books.com.
dns A 192.168.100.21
www A 192.168.100.20
# 配置检查
Shell > named-checkconf
Shell > named-checkzone reada.org /var/named/named.reada
zone sitea.com/IN: loaded serial 0
OK
Shell > named-checkzone books.com /var/named/named.books
zone testb.com/IN: loaded serial 0
OK
# 开启 DNS 服务
Shell > systemctl start named.service
配置 Web 服务器:
Shell > mkdir /usr/local/apache2/htdocs/reada/ && echo "Reada!" > /usr/local/apache2/htdocs/reada/index.html
Shell > mkdir /usr/local/apache2/htdocs/books/ && echo "Books!" > /usr/local/apache2/htdocs/books/index.html
# 编辑主配置 httpd.conf,让其加载虚拟主机扩展配置文件
Shell > vim /usr/local/apache2/conf/httpd.conf
...
Include conf/extra/httpd-vhosts.conf
...
# 虚拟主机扩展配置文件默认会提供一些配置参考,使用 vim 注释掉(":set nu",":23,$ s/^/#/g")
## 该文件的具体配置如下:
Shell > vim /usr/local/apache2/conf/extra/httpd-vhosts.conf
<VirtualHost 192.168.100.20:80>
ServerAdmin webmaster@dummy-host2.example.com
DocumentRoot "/usr/local/apache2/htdocs/reada"
ServerName www.reada.org
ErrorLog "logs/reada-error_log"
CustomLog "logs/reada-access_log" common
</VirtualHost>
<VirtualHost 192.168.100.20:80>
ServerAdmin webmaster@dummy-host1.example.com
DocumentRoot "/usr/local/apache2/htdocs/books"
ServerName www.books.com
ErrorLog "logs/books-error_log"
CustomLog "logs/books-access_log" common
</VirtualHost>
# 在主配置文件 httpd.conf 中给目录设置权限
Shell > vim /usr/local/apache2/conf/httpd.conf
...
<Directory "/usr/local/apache2/htdocs/reada">
Options Indexes FollowSymLinks
AllowOverride none
Require all granted
</Directory>
<Directory "/usr/local/apache2/htdocs/books">
Options Indexes FollowSymLinks
AllowOverride none
Require all granted
</Directory>
# 语法检查
Shell > /usr/local/apache2/bin/apachectl -t
Syntax OK
# 启动 Web 服务器
Shell > /usr/local/apache2/bin/apachectl start
两个 Web 站点配置完成。
访问这两个 Web 站点
Windows 客户端访问这两个虚拟主机时,需要将主 DNS 配置为 192.168.100.21

配置重定向
实现的方式为 mod_rewrite,这是最灵活也是最推荐的方式。
首先加载模块:
Shell > vim /usr/local/apache2/conf/httpd.conf
...
LoadModule rewrite_module modules/mod_rewrite.so
...
配置如下:
Shell > vim /usr/local/apache2/conf/extra/httpd-vhosts.conf
<VirtualHost 192.168.100.20:80>
ServerAdmin webmaster@dummy-host2.example.com
DocumentRoot "/usr/local/apache2/htdocs/reada"
ServerName www.reada.org
ErrorLog "logs/reada-error_log"
CustomLog "logs/reada-access_log" common
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP_HOST} ^www\.reada\.org$
RewriteRule ^(.*)$ http://www.books.com/$1 [R=301,L]
</IfModule>
</VirtualHost>
<VirtualHost 192.168.100.20:80>
ServerAdmin webmaster@dummy-host1.example.com
DocumentRoot "/usr/local/apache2/htdocs/books"
ServerName www.books.com
ErrorLog "logs/books-error_log"
CustomLog "logs/books-access_log" common
</VirtualHost>
Shell > /usr/local/apache2/bin/apachectl restart
IfModule 配置段说明:
- 当模块的内部名称为 mod_rewrite.c 被载入时,执行相关的指令
RewriteEngine on- 开启 rewrite 功能RewriteCond %{HTTP_HOST} ^www.reada.org- RewriteCond 是 mod_rewrite 模块中的 "条件判断" 指令,语法为RewriteCond TestString CondPattern [Flags];TestString 替换为测试的字符串或变量(变量是如 %{ } 的形式),CondPattern 替换为具体的匹配规则(正则表达式或字符串);Flags 则为可选的附加标志。该指令必须放在 RewriteRule 指令之前。RewriteRule ^(.*)$ http://www.books.com/$1 [R=301,L]- RewriteRule 则是当 RewriteCond 指令满足条件后执行的重写规则,语法为RewriteRule Pattern Substitution [Flags]。Pattern 表示以正则表达式匹配请求的 URL 路径,正则表达式中,^表示匹配开头,$表示匹配结尾,.表示匹配除换行符之外的任何单个字符,*表示匹配前一个字符的出现次数,可以是 0 或任意次数,( )表示作为一个组合的整体。Substitution 表示替换为跳转后的 URL,$1是正则表达式中的反向引用,表示引用第 1 个捕获组 "( )" 中匹配到的内容。[R=301,L]则是行为标志,R=301 表示 301 永久重定向,L 表示 Last,即匹配成功到后立刻停止,不再继续匹配。
还原
还原 DNS 服务器的配置:
Shell > systemctl stop named.service
# 删除数据解析文件
Shell > rm -rf /var/named/named.{books,reada}
# 还原区域文件
Shell > cat /etc/named.rfc1912.zones
zone "localhost.localdomain" IN {
type primary;
file "named.localhost";
allow-update { none; };
};
zone "localhost" IN {
type primary;
file "named.localhost";
allow-update { none; };
};
zone "1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa" IN {
type primary;
file "named.loopback";
allow-update { none; };
};
zone "1.0.0.127.in-addr.arpa" IN {
type primary;
file "named.loopback";
allow-update { none; };
};
zone "0.in-addr.arpa" IN {
type primary;
file "named.empty";
allow-update { none; };
};
还原 Web 服务器的配置:
Shell > /usr/local/apache2/bin/apachectl stop
Shell > rm -rf /usr/local/apache2/htdocs/{books,reada}
# 还原主配置文件中已经修改的内容
Shell > vim /usr/local/apache2/conf/httpd.conf
...
#Include conf/extra/httpd-vhosts.conf
...
#LoadModule rewrite_module modules/mod_rewrite.so
...
#<Directory "/usr/local/apache2/htdocs/reada">
# Options Indexes FollowSymLinks
# AllowOverride none
# Require all granted
#</Directory>
#<Directory "/usr/local/apache2/htdocs/books">
# Options Indexes FollowSymLinks
# AllowOverride none
# Require all granted
#</Directory>
版权声明:「自由转载-保持署名-非商业性使用-禁止演绎 3.0 国际」(CC BY-NC-ND 3.0)
用一杯咖啡支持我们,我们的每一篇[文档]都经过实际操作和精心打磨,而不是简单地从网上复制粘贴。期间投入了大量心血,只为能够真正帮助到您。
暂无评论










