Apache 配置介绍

Apache 配置文件

Apache 配置文件格式

  • 配置文件中,以井号(#)开头表示注释

  • 配置文件中的指令分为两种,单一指令和指令块。并且指令不区分大小写



查看预定义的主配置文件位置:

通过 httpd -V 或 apachectl -V 可以查看预定义的主配置文件位置

image

 -D HTTPD_ROOT="/usr/local/apache"          # 指定 Apache 的安装根目录
 -D DEFAULT_PIDLOG="logs/httpd.pid"         # 指定PID文件存放位置
 -D DEFAULT_ERRORLOG="logs/error_log"       # 错误日志存放位置
 -D AP_TYPES_CONFIG_FILE="conf/mime.types"  #  MIME 类型配置文件的路径
 -D SERVER_CONFIG_FILE="conf/httpd.conf"    # 服务器的主配置文件的路径。

说明: 如果是相对路径,那么是相相对于 HTTPD_ROOT 指定的路径



手动指定配置文件方法:

如果不想使用默认定义的配置文件,想要自定义一个主配置文件。可以在启动服务的时候,通过-f选项 来自定义配置文件。

例如:

apachectl start -f /etc/apache/apache2.conf
  • 启动Apache服务时,没有手动指定配置文件,会使用预定义的配置文件启动,如果不存在就报错。

  • 如果手动指定了配置文件,那么启动服务就会读取指定配置文件,不会使用预定义的配置文件,如果使用的是相对路径,则是相对于ServerRoot的路径



Apache 子配置文件

如果把所有配置都放一个配置文件里,不方便后期管理。可以将不同的配置放在不同的文件里面,然后在主配置文件中通过对应的指令来进行引入。这样在加载主配置文件的时候,子配置文件也会跟着加载。

  • Include:如果指定的文件或文件模式不存在,Apache将在启动时抛出错误,并且服务器将无法启动。

  • IncludeOptional:允许指定的文件或文件模式不存在。如果文件不存在,Apache将简单地忽略该指令,而不会产生错误。

例如:

# 配置文件不存在,也不会报错

IncludeOptional conf-enabled/*.conf

Apache 基础配置

指定 Apache 服务器进程运行时的用户和用户组

  • User: 指定了运行Apache服务器进程的用户身份。

  • Group:指定了运行Apache进程的用户组。

指定Apache监听的端口

可以是指定的IP地址的端口,也可以是监听本机所有IP地址的端口。 Listen [ip:]port

  • Listen:指定指定Apache监听的端口

指定 Apache的根目录

在Web服务器的上下文中,"根目录"通常指的是URL中的/所代表的服务器上的目录。这个根目录是Web服务器用来响应Web请求的起始点,是存放网站文件(如HTML文档、图片、脚本等)的基本路径。

  • DocumentRoot:指定 Apache的根目录

指定Apache的安装目录

在Apache服务的配置文件中,如果使用相对路径(如配置文件、模块、日志等),那么都是相对于服务器安装位置的。

  • ServerRoot 指令:指定服务器的安装位置

指定web服务域名

  • ServerName:定义服务器的全局主机名


Apache 日志管理

Apache日志管理功能是mod_log_config 模块提供,所以需要保证这个模块成功被加载才能完成日志管理。

  • 错误日志:记录服务器的错误信息。错误日志的格式不像访问日志那样灵活,但可以配置错误日志的位置和记录级别。

  • 访问日志:记录Apache服务器所有接收到的请求。

Apache 错误日志管理:

  • ErrorLog :指定错误日志的路径和日志名。

  • LogLevel:指定记录到错误日志的日志级别。

日志级别说明:

  • debug:提供调试信息,适用于开发或测试环境。日志信息最详细

  • info:提供一般信息性消息,比 debug 级别少。

  • notice:提供正常但有意义的条件的信息。

  • warn:提供警告级别的消息,通常表示有某些需要关注的问题。

  • error:提供错误级别的消息,通常表示无法提供某个请求或功能的问题。

  • crit:提供临界条件的消息,通常表示更严重的问题。

  • alert:需要立即采取行动的消息。

  • emerg:提供紧急消息,通常表示系统不可用的状况。

Apache 访问日志管理:

和错误日志的区别在于,访问日志可以自定义内容格式。

  • LogFormat:自定义访问日志的格式

  • CustomLog:指定访问日志的存放位置和文件名,需要指定使用的日志格式。

注:相关参数说明:https://httpd.apache.org/docs/2.4/zh-cn/mod/mod_log_config.html



Apache 指令块


VirtualHost 指令块

作用:

用于配置虚拟主机,每个<VirtualHost> 块定义了单独一个网站的配置

格式:

<VirtualHost  IP地址|域名|端口>
    相关配置参数
</VirtualHost>

参数选项:

很多基础配置中的选项都可以用于<VirtualHost> 块中,但是一些全局配置指令不能用于该指令块。

  • ServerRoot:指定服务的安装目录

  • Listen:指定监听的端口

  • LoadModule:用于加载Apache特定模块

  • User 和 Group:运行服务的用户和组

  • Include:包含子配置文件

  • ServerTokens:Apache服务器响应头中提供的信息量。例如版本信息

例如:

<VirtualHost *:8000>
    DocumentRoot /home/ehigh/work/html/generalsystemfe/dist

    <Directory /home/ehigh/work/html/generalsystemfe/dist>
        Options FollowSymLinks MultiViews
        AllowOverride All
        Require all granted
    </Directory>

    ErrorLog    /var/log/apache2/general_error.log
    CustomLog  /var/log/apache2//general_access.log combined
</VirtualHost>

说明:

正常情况下,一个物理web服务器只能部署一个网站,但是通过虚拟主机技术,可以再一个物理服务器上托管多个网站。每个网站表现得就像是在自己独立的服务器上运行一样。

一个Apache服务器中可以配置多个虚拟主机,可以通过三种方式来区分不同的虚拟主机:

  • 端口:虚拟主机通过不同的端口来区分。这意味着所有虚拟主机共享相同的IP地址,但是每个网站通过不同的端口访问。

  • 域名:多个虚拟主机共享同一个IP地址和端口,但是根据请求的HTTP头部中的Host字段来区分

  • IP:每个虚拟主机拥有不同的IP地址。这意味着您的服务器必须有多个IP地址,并且每个网站被分配到不同的IP地址

Directory 指令块

作用:

对文件系统层面的目录进行规则和行为方面的权限管理。

格式:

# dir-path 表示文件系统上的目录路径。

<Directory "dir-path">
    # 配置参数
</Directory>

参数选项:

  • Options:用于开启或关闭指定目录中的特定功能,可以控制目录的行为和服务器如何响应对该目录的请求。

  • Require:用于指定访问权限,当用户发起请求时,通过这个选项控制这个请求是否具备对应的权限

  • DirectoryIndex:用于指定目录中的默认页面。

  • ErrorDocument:定义特定错误代码的自定义错误页面

  • AllowOverride:控制 .htaccess 文件中的配置是否生效。

参数值说明:

Options

  • Indexes:服务器会生成一个索引文件,该文件是包含该目录内所有文件和子目录列表的网页。

  • FollowSymLinks:如果请求的是一个符号连接(软链接)文件,则可以读取出这个文件的内容。

  • ExecCGI:允许该目录下的 CGI 脚本可以被服务器执行。

  • None:表示关闭了该目录的所有额外功能,这包括目录列表、符号链接跟随等功能。

  • MultiViews:开启内容协商功能,在客户端请求的资源没有明确文件扩展名的情况下,尝试寻找最匹配的文件。

  • All:几乎开启所有额外功能。


Require

  • Require all granted:允许所有访问

  • Require all denied:拒绝所有访问

  • Require user <username>:仅允许特定用户访问

  • Require ip <ip-address>:仅允许来自特定IP地址的访问

AllowOverride

  • None:不允许 .htaccess 文件中的任何指令覆盖全局配置。这是出于安全和性能考虑的默认设置

  • All:允许 .htaccess 文件中的所有指令覆盖全局配置。

例如:

<Directory /var/www/html>
    Options Indexes FollowSymLinks MultiViews
    AllowOverride All
    Require all granted
</Directory>
  • Indexes:如果客户端请求的是 /var/www/html 目录下的某个子目录,并且该子目录中没有默认的索引文件(如 index.html),则服务器会自动生成一个索引文件,该文件包含该目录内所有文件和子目录列表的网页。

  • FollowSymLinks:假设/var/www/html 下有一个a.txt文件,这个文件是b.txt的软链接。如果没有开启这个选项,客户端请求a.txt文件时,会请求失败。

  • MultiViews:,如果一个请求是针对 /index,而服务器上有 index.html 和 index.pdf,Apache 会根据请求的类型(如接受的文件类型)来选择合适的文件。

  • Require all granted:该目录允许所有人访问

  • AllowOverride All:如果在/var/www/html目录下创建一个名为 .htaccess 的文件,那么这个文件里面关于Apache的配置会生效。


Location 指令块

作用:

在URL路径上进行权限控制,不像Directory一样关心文件系统的实际路径

格式:

<Location URL-path>
    # 配置指令
</Location>

配置参数:

配置指令很多和directory指令块重合。

例如:

拒绝所有对 /admin 路径的访问请求

<Location /admin>
    Require all denied
</Location>

FilesMatch 指令块:

作用:
通过正则表达式匹配特定条件的文件,匹配成功后该文件会收到<FilesMatch> 块内定义的配置指令的影响。

格式;

<FilesMatch regex>
    # 配置指令
</FilesMatch>

例如:

匹配所有以 .ht 开头的文件名,拒绝请求 .htaccess 文件

<FilesMatch "^\.ht">
        Require all denied
</FilesMatch>

Files 指令块:

作用:

用于匹配特定名称的文件,支持通配符(如 * 和 ?)。但是不支持正则表达式。

格式:

<Files "文件名称">
    # 配置指令
</Files>

例如:

匹配 index.html这个文件

<Files "index.html">
    Require all granted
</Files>

IfModule 指令块

作用:

用于包装一系列配置指令,这些指令只有在特定的模块被加载时才会生效。

格式:

<IfModule 模块名称>
	# 参数指令
</IfModule>

例如:

<IfModule dir_module>
    DirectoryIndex index.html
</IfModule>

Apache 进阶配置

Apache反向代理功能:

代理: 将客户端的请求转发到其它服务器。代理分为正向代理和反向代理。

正向代理: 和客户端交互,例如;为内部网络的客户端提供出口到互联网的能力。

image

反向代理: 和服务端交互,将客户端的请求转发到后端服务器,并将响应返回给客户端。对于客户端而言,它看似与 Apache 服务器直接交互,而实际上请求可能被转发到了其他服务器。

image

反向代理工作流程:

  1. 客户端发送请求到反向代理服务器

  2. 反向代理服务器(如果是apache)通过ProxyPass 指令将这个请求转发到后端服务器。

  3. 后端服务器接收请求并处理后,返回响应給代理服务器。

  4. 代理服务器将后端服务器的响应发送给客户端。


Apache 实现反向代理:

Apache的反向代理功能由mod_proxy 和 mod_proxy_http 模块提供

  • mod_proxy 模块:提供基本的代理功能。它是实现代理请求(包括反向代理和负载均衡)的核心模块。

  • mod_proxy_http 模块:是 mod_proxy 的一个子模块,专门用于处理 HTTP 和 HTTPS 的请求。

例如:将访问本机80的http请求发到1212端口上

<VirtualHost *:80>
    ProxyRequests Off
    ProxyPreserveHost On
    # 将所有访问端口 80 的请求转发到 http://127.0.0.1:1212/
    ProxyPass / http://127.0.0.1:1212/
    ProxyPassReverse / http://127.0.0.1:1212/
</VirtualHost>

说明:

ProxyRequests :默认值是off,用于设置和调整代理服务器的行为。

  • ProxyRequests On:将Apache配置为正向代理服务器,此时Apache 服务器会转发客户端(如浏览器)的请求到其他服务器。

  • ProxyRequests Off:将Apache 配置为反向代理服务器,此时会接收来自互联网的请求并将它们转发到内部网络中的服务器。

默认情况下,Apache既不作为一个反向代理服务器也不作为一个正向代理服务器,而是作为一个直接处理客户端 HTTP 请求的 Web 服务器。


ProxyPreserveHost:控制在代理请求时是否保留原始请求的 Host 头信息。

  • ProxyPreserveHost On: Apache 在转发请求到后端服务器时保留原始请求的 Host 头信息。后端服务器收到的请求将看起来好像是直接从客户端发出的,保留了原始请求中的 Host 头。

  • ProxyPreserveHost Off: 默认设置。Apache 在转发请求时会使用代理服务器(即自身)的 Host 头替换原始请求的 Host 头。后端服务器看到的 Host 头将是 Apache 服务器的地址或域名。


ProxyPass:用于将某个URL路径上的请求转发到指定的后端服务器。 ProxyPass [path] [url]

  • [path]: 客户端请求的路径。

  • [url]: 要将请求转发到的后端服务器和路径。

ProxyPassReverse:调整从后端服务器返回的 HTTP 响应。通过修改响应中的 HTTP 头部,特别是涉及位置(Location)和重定向的头部,以确保它们指向反向代理服务器(即 Apache 服务器)而不是原始的后端服务器。 ProxyPassReverse [path] [url]

如果是全局配置 ProxyRequests 和 ProxyPreserveHost,那么整个Apache服务器都会作为反向代理服务器,如果是局部配置(虚拟主机),那么只会会影响该虚拟主机的行为,不会将整个Apache作为反向代理。

例如:

<VirtualHost *:80>
    ProxyRequests Off
    ProxyPreserveHost On
    ProxyPass /manager   http://192.168.0.104:8001
    ProxyPassReverse /manager http://192.168.0.104:8001
</VirtualHost>
  • ProxyPreserveHost:在转发请求到后端服务器时保持原始的 Host HTTP 头不变

  • ProxyPass:当客户端请求:http://xxxx:80/manager 时,会将这个请求转发到 http://192.168.0.104:8001(客户端发起的对 /manager 的请求实际上由位于 192.168.0.104 的服务器上的 8001 端口处理。)

  • ProxyPassReverse:如果后端服务器 192.168.0.104:8001 返回一个重定向到 http://192.168.0.104:8001/otherpage 的响应,那么 ProxyPassReverse 会将这个重定向地址修改为 http://xxxx:80/manager/otherpage, 确保重定向回到 Apache 服务器,而不是直接到后端服务器。


Apache 重定向功能

重定向: 在网络上进行请求时,自动将一个网页或请求路径跳转到另一个不同的地址或路径的过程。

  • 301 永久重定向 (Moved Permanently): 这意味着所请求的页面已永久移动到新位置。

  • 302 临时重定向 (Found 或 Temporary Redirect): 所请求的页面临时移动到新位置,未来可能会返回到原始地址。

Apache 实现简单场景的重定向功能:

简单场景重定向,可以通过 mod_alias 模块实现,它提供了 Redirect的指令,通过这个指令就可以实现简单的重定向场景。 Redirect [HTTP 状态码] 源url路径 目标URL路径

  • HTTP状态码:如果不指定就是302

  • 源url路径:需要重定向的原始路径

  • 目标url路径:可以是相对路径或绝对URL

绝对URL和相对URL

  • 绝对URL:一个完整的网址,包括协议、域名以及可能的路径。

  • 相对URL:一个不包含域名和协议的简短路径,它基于当前的域名。

例如:访问本地8000端口的时候重定向到0.105的8001端口。没有指定http状态码,默认是302

<VirtualHost  *:8000>
    Redirect /  http://192.168.0.105:8001
</VirtualHost>

Apache 复杂场景重定向

这种场景下通常需要使用 Apache 的 URL 重写功能,通过 mod_rewrite 模块实现。

mod_rewrite 模块提供了三个指令来实现重写操作:

  • RewriteEngine:用于开启或关闭 URL 重写引擎。有两个默认值。On:开启 Off:关闭

  • RewriteCond:定义一个或多个重写条件。只有当这些条件满足时,随后的 RewriteRule 才会被触发。

  • RewriteRule:定义具体的重写规则。支持正则表达式

例如:将 HTTP 请求重定向到 HTTPS

RewriteEngine On
RewriteCond %{HTTPS} off  # %{HTTPS}是一个服务器变量,表示当前请求是否通过 HTTPS 协议发送。如果请求是通过 HTTPS 发送的,这个变量的值会是 on
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

Apache 响应头管理

响应头的概念:在 HTTP 协议中,响应头是由服务器在响应 HTTP 请求时发送的,包含了关于资源和服务器自身的信息。每个响应头都由一个名称(Header Name)和相应的值(Header Value)组成。


典型的HTTP响应头格式:

HTTP/1.1 200 OK                          # HTTP协议版本  状态码和状态消息
Content-Type: text/html; charset=UTF-8   # 响应体的媒体类型
Content-Length: 15824                    # 响应体的大小,以字节为单位
Connection: keep-alive                   # 控制连接的选项,持久连接
Server: Apache/2.4.1 (Unix)              # 生成响应的服务器软件信息
Last-Modified: Mon, 12 Dec 2022 15:56:35 GMT
Cache-Control: max-age=600               # 响应数据的缓存策略,指定了资源的最大缓存寿命为 600 秒
Expires: Thu, 01 Dec 2023 16:00:00 GMT   # 响应过期的时间

Apache有一个名为mod_headers 的模块,通过这个模块可以修改Apache响应的响应头。

该模块提供了一个 Header 指令,通过这个指令就可以指定或修改响应头: Header 操作类型 HTTP响应头的名称 "头部对应的值"


常见的操作类型有以下:

  • set:用于设置一个响应头,属于覆盖式操作,确保指定的头部只有一个值

  • add:用于添加一个新的 HTTP 响应头,而不替换已有的头部,如果指定的头部已存在,Header add 会将新的值添加到现有值旁边。这意味着同一个头部可以有多个值。

  • unset:用于删除特定的 HTTP 响应头,Apache 会从即将发送给客户端的响应中移除指定的头部。

Apache 跨域配置:

域(domain)的概念: “跨”意味着“超越”或“穿过”,“域”在这里指的是“源”。所以“跨域”字面上的意思是“超越源的限制”。

源(origin)的概念: 由协议、域名和端口组成的组合,只有当这三部分都相同,两个URL才被认为是同源。

跨域的概念:如果从某个源向另外一个源发起http请求,如果协议、端口、域名其中有一个不同,都称为跨域。

同源策略(Same-Origin Policy): web浏览器默认有一种安全机制叫作同源策略,限制了来自不同源的文档或脚本互相交互,以此来防止潜在的恶意行为。

CORS机制:CORS(跨源资源共享)是解决跨域问题的一种机制,服务器可以通过设置 Access-Control-Allow-Origin 响应头来指明哪些源被允许访问资源。如果浏览器的 CORS 检查通过,它将允许跨域请求。

HTTP中和 跨源资源共享(CORS)相关的响应头:

  • Access-Control-Allow-Origin:指定哪些源(origin)可以访问资源。如果未设置此响应头,浏览器会遵守同源策略,这意味着不允许任何跨源请求。

  • Access-Control-Allow-Methods:指定允许跨源请求使用的 HTTP 方法

  • Access-Control-Allow-Headers:预检请求(preflight request)的响应中,指明了实际请求中允许携带的 HTTP 头部。

  • Access-Control-Allow-Credentials:指示是否允许跨源请求携带凭证(如 Cookies 和 HTTP 认证信息)。

说明:

  • Access-Control-Allow-Methods:默认情况下,浏览器不会在跨源请求中包含凭证信息,需要显式设置为 true 来允许携带凭证。

  • Access-Control-Allow-Headers:默认所有非简单的头部(即除了 CORS 安全列出的头部之外的头部)在跨域时都不能被使用

  • Access-Control-Allow-Methods:默认仅允许简单的请求方法(GET、POST 和 HEAD),如果是非简单方法,没有指定的话就在跨源请求将不被允许

简单请求和非简单请求:

简单请求:

请求方法:

只能是 GET、HEAD 或 POST。

HTTP 头:

只能使用以下头部(除了浏览器自动添加的头部,如 Content-Type):

  • Accept

  • Accept-Language

  • Content-Language

  • Content-Type(但限于三个值:text/plain、multipart/form-data、application/x-www-form-urlencoded)

非简单请求:

请求方法:

使用了除 GET、HEAD 和 POST 之外的 HTTP 方法。如 PUT、DELETE、CONNECT等

HTTP头:

除简单请求允许之外的头部,或者 Content-Type 头部的值是除上述三种之外的其他值,如 application/json。

Apache 跨域请求配置:

通过 Header 指令设置和 跨源资源共享(CORS)相关的响应头。

# * 表示允许所有的跨域请求
Header set Access-Control-Allow-Origin "*"

# 如果是简单的一些跨域请求,其它的一些参数可以不配置
Header set Access-Control-Allow-Headers   "对应的请求头"
Header set Access-Control-Allow-Methods "GET, POST, OPTIONS"
Header set Access-Control-Allow-Credentials true

Apache 安全优化

隐藏版本信息:

通过HTTP响应头的 server 字段可以查看使用的web服务器及其版本信息。将服务器版本信息隐藏后,可以让攻击者更难发现服务器的具体版本和配置信息,从而更难针对性地发起攻击。

  • ServerTokens:控制 Apache 在 HTTP 响应头部 Server 字段中提供的信息量。

  • ServerSignature: 控制 Apache 在生成的错误页面(如 404 页面)和服务器生成的目录列表底部显示的服务器签名信息。


ServerTokens 可以使用以下预定义值:

  • Prod:仅显示 Apache,不显示版本号或其他详细信息

  • Major:显示主版本号(例如 Apache/2)

  • Minor:显示主版本号和次版本号(例如 Apache/2.4)

  • Min:显示完整的版本号,但不显示操作系统信息

  • OS:显示完整的版本号和操作系统信息

  • Full(默认值):显示完整的版本号、模块信息和操作系统信息

ServerSignature 可以使用以下预定义值:

  • On:在页面底部显示服务器版本和虚拟主机名。

  • Off:不显示服务器签名。

  • EMail:显示服务器管理员的电子邮件地址(从 ServerAdmin 指令中获取)。

例如:

ServerTokens  Prod
ServerSignature  Off


用户认证访问控制:

通过Directory指令块可以控制文件系统上目录的权限,通过Location指令块可以对url中的路径做权限控制。

在Directory指令块或Location指令块中,可以基于用户认证和授权配置,从而实现更细粒的权限配置。


Apache实现基于用户的认证访问控制:

1、需要通过Apache自带的htpasswd 工具创建认证文件,认证文件包含用户名和密码

htpasswd -c /etc/apache2/.htpasswd username

第一次创建需要加-c选项,指定存放用户信息的文件(会自动创建),后面添加用户就不需要加 -c 选项

2、访问规则配置

例如:只允许admin用户访问 /systemtest页面

<VirtualHost *:80>
    ServerName www.example.com

    # 其他配置 ...

    <Location "/systemtest">
        AuthType Basic
        AuthName "System Test Restricted Area"
        AuthUserFile /etc/apache2/.htpasswd
        Require user admin
    </Location>
</VirtualHost>
  • AuthType:指定认证的类型,一般设置认证类型为基本认证(用户的用户名和密码以明文形式发送)

  • AuthName:设置认证区域的名称,这将在弹出的登录对话框中显示

  • AuthUserFile:指向包含用户名和密码的文件

  • Require tom:表示只有有效用户(即在 .htpasswd 文件中的用户)可以访问


实现HTTPS功能

Apache的HTTPS功能是 mod_ssl模块 提供,所以需要先保证该模块被加载。

mod_ssl 模块提供了这些选项来实现HTTPS的配置。

  • SSLEngine :是否为相应的虚拟主机启用SSL/TLS

  • SSLCertificateFile:指定服务器证书的位置

  • SSLCertificateKeyFile:指定服务器私钥文件的位置

例如:

<VirtualHost *:443>
    ServerName www.yourdomain.com
    SSLEngine on
    SSLCertificateFile /etc/ssl/certs/apache-selfsigned.crt
    SSLCertificateKeyFile /etc/ssl/private/apache-selfsigned.key

    # 其他配置 ...
</VirtualHost>

Apache 性能调优

选择合适的工作模式:

  • Prefork 模式:适用于简单、低负载的站点或兼容性要求较高的应用

  • Worker 模式:需要处理大量请求但又需要较小的内存占用场景。可用于中等负载的服务器

  • Event 模式:适合高负载和高性能的服务器环境。

  • WinNT 模式:专为 Windows 设计的工作模式

查看当前工作模式方法;

通过httpd -V 或 apachectl -V 的输出信息可以查看Apache默认的工作模式。
image

通过查看Apache服务当前加载的是哪个MPM模块,也可以确定当前的工作模式httpd -M 或 apachectl -M

image


web服务器压缩功能:

  • 当浏览器请求一个资源时,它在Accept-Encoding头部中包含它支持的压缩格式,例如 gzip、deflate。

  • 如果浏览器支持压缩(如 gzip),并且服务器配置了相应的压缩,服务器会发送压缩过的资源,并在Content-Encoding头部中标明所用的压缩格式

  • 如果浏览器不支持压缩,或者请求的资源类型没有配置为压缩,服务器会发送未压缩的资源。

MIME介绍:

MIME是 Multipurpose Internet Mail Extensions 的缩写,译为多用途互联网邮件扩展。刚开始是给电子邮件设计的一种规范,用于支持通过电子邮件发送非ASCII文本和非文本附件(如图像、视频、音频等)。

后来,随着互连网的发展,MIME的应用扩展到了互联网上,成为一种重要的标准,用于描述文档的性质和格式。在web上,MIME是一种用于指示文档的类型和格式的标准,使得览器能够正确地显示或处理下载的数据。

例如,当Web服务器发送HTML文档时,它会在HTTP头信息中使用Content-Type字段来指定MIME类型,如text/html。

MIME由两部分组成:主类型/子类型

  • 大类:表示文件的基本类别

  • 小类:在大类的基础上进一步细分,描述文件的具体格式或数据类型。

常见的大类:

  • text:用于文本文件,这些文件通常包含人类可读的文本

  • image:用于图像文件

  • audio:用于音频文件

  • video:用于视频文件

  • application:用于各种类型的数据和应用程序文件,例如二进制文件、文档文件等

例如:text/html,text 是大类,表示这是一个文本类型的文件,html 是小类,指明了具体的文本格式为 HTML

Apache 实现压缩功能:

对所有响应数据的压缩:

可以实现不基于特定的 MIME 类型来压缩文件,而是压缩所有响应数据。对所有HTTP响应进行压缩,会加大CPU负担

  • SetOutputFilter:为服务器响应应用一个或多个过滤器,以修改或处理输出数据。 SetOutputFilter filter-name

Apache的mod_deflate模块提供了一个名为DEFLATE的过滤器,通过这个过滤器可以实现对响应内容的压缩。

例如:配置对整个网站的所有响应内容进行压缩。

<Location />
    SetOutputFilter DEFLATE
</Location>

对特定数据进行压缩

根据特定的MIME类型对内容进行压缩,这样可以更加精细地控制哪些内容需要被压缩。

  • AddOutputFilterByType:根据响应的 MIME 类型(Content-Type)应用输出过滤器。AddOutputFilterByType filter-name mime-type

例如:apache的常见压缩策略

<IfModule deflate_module>
    AddOutputFilterByType DEFLATE text/plain
    AddOutputFilterByType DEFLATE text/html
    AddOutputFilterByType DEFLATE text/xml
    AddOutputFilterByType DEFLATE text/css
    AddOutputFilterByType DEFLATE application/xml
    AddOutputFilterByType DEFLATE application/xhtml+xml
    AddOutputFilterByType DEFLATE application/rss+xml
    AddOutputFilterByType DEFLATE application/javascript
    AddOutputFilterByType DEFLATE application/x-javascript
</IfModule>

说明:AddOutputFilterByType 可能已弃用,推荐使用 mod_filter 模块提供的 FilterProvider 指令作为替代。

posted on 2024-01-17 23:42  背对背依靠  阅读(314)  评论(0编辑  收藏  举报