Apache 配置介绍
Apache 配置文件
Apache 配置文件格式
-
配置文件中,以井号(#)开头表示注释
-
配置文件中的指令分为两种,单一指令和指令块。并且
指令不区分大小写
查看预定义的主配置文件位置:
通过 httpd -V 或 apachectl -V
可以查看预定义的主配置文件位置
-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反向代理功能:
代理: 将客户端的请求转发到其它服务器。代理分为正向代理和反向代理。
正向代理: 和客户端交互,例如;为内部网络的客户端提供出口到互联网的能力。
反向代理: 和服务端交互,将客户端的请求转发到后端服务器,并将响应返回给客户端。对于客户端而言,它看似与 Apache 服务器直接交互,而实际上请求可能被转发到了其他服务器。
反向代理工作流程:
-
客户端发送请求到反向代理服务器
-
反向代理服务器(如果是apache)通过ProxyPass 指令将这个请求转发到后端服务器。
-
后端服务器接收请求并处理后,返回响应給代理服务器。
-
代理服务器将后端服务器的响应发送给客户端。
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默认的工作模式。
通过查看Apache服务当前加载的是哪个MPM模块,也可以确定当前的工作模式httpd -M 或 apachectl -M
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 指令作为替代。