Apache htppd功能篇04—重定向

概述

本章,您将学习到 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 字符串
  • Second-Level Domain (SLD) - 常翻译为 "二级域",在不同的语境中有三套不同的标准:

    • 在 DNS 协议或 DNS zone 或 FQDN 语境中 - TLD 下的第一个标签,指代的是 rockylinux 这一标签
    • 在 ICANN/IANA 或注册语境中 - 指代的是 rockylinux.org 这部分
    • 在裸 Label 语境中 - 指 rockylinux 字符串
  • Subdomain​ - 泛指在某个父域之下自行创建的更低层级的域,在不同的语境中有三套不同的标准:

    • 在 DNS 协议或 DNS zone 或 FQDN 语境中 - 指代的是 docs 这一标签
    • 在 ICANN/IANA 或注册语境中 - 指代的是 docs.rockylinux.org 这部分
    • 在裸 Label 语境中 - 指 docs 字符串
  • 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

file

配置重定向

实现的方式为 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>
Avatar photo

关于 陸風睿

GNU/Linux 从业者、开源爱好者、技术钻研者,撰写文档既是兴趣也是工作内容之一。Q - "281957576";WeChat - "jiulongxiaotianci",Github - https://github.com/jimcat8
用一杯咖啡支持我们,我们的每一篇[文档]都经过实际操作和精心打磨,而不是简单地从网上复制粘贴。期间投入了大量心血,只为能够真正帮助到您。
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇