Apache 配置:.htaccess

Apache 的 .htaccess 文件允许用户配置其控制的 Web 服务器的目录,而无需修改主配置文件。

虽然这很有用,但重要的是要注意使用 .htaccess 文件会降低 Apache 的速度,因此,如果您有权访问主服务器配置文件(通常称为 httpd.conf),则应在 Directory 块中添加此逻辑。

有关 .htaccess 文件可以执行的操作的更多详细信息,请参阅 Apache HTTPD 文档站点上的 .htaccess

本文档的其余部分将讨论您可以添加到 .htaccess 中的不同配置选项及其作用。

以下大多数块使用 IfModule 指令,仅当相应模块配置正确且服务器已加载它时,才执行块内的指令。这样,如果模块未加载,我们可以避免服务器崩溃。

重定向

有时我们需要告诉用户某个资源已移动,无论是临时还是永久。这就是我们使用 RedirectRedirectMatch 的原因。

apacheconf
<IfModule mod_alias.c>
  # Redirect to a URL on a different host
  Redirect "/service" "http://foo2.example.com/service"

  # Redirect to a URL on the same host
  Redirect "/one" "/two"

  # Equivalent redirect to URL on the same host
  Redirect temp "/one" "/two"

  # Permanent redirect to a URL on the same host
  Redirect permanent "/three" "/four"

  # Redirect to an external URL
  # Using regular expressions and RedirectMatch
  RedirectMatch "^/oldfile\.html/?$" "http://example.com/newfile.php"
</IfModule>

第一个参数的可能值列在下面。如果未包含第一个参数,则默认为 temp

permanent

返回永久重定向状态 (301),指示资源已永久移动。

temp

返回临时重定向状态 (302)。**这是默认值**。

seeother

返回“See Other”状态 (303),指示资源已被替换。

gone

返回“Gone”状态 (410),指示资源已被永久删除。使用此状态时,应省略 URL 参数。

跨源资源

第一组指令控制来自服务器的资源的 CORS(跨源资源共享)访问。CORS 是一种基于 HTTP 标头的机制,允许服务器指示浏览器应允许加载资源的外部来源(域名、协议或端口)。

出于安全原因,浏览器限制了从脚本发起的跨源 HTTP 请求。例如,XMLHttpRequest 和 Fetch API 遵循同源策略。使用这些 API 的 Web 应用程序只能请求加载应用程序的相同来源的资源,除非来自其他来源的响应包含适当的 CORS 标头。

通用 CORS 访问

此指令将为来自任何网站的目录中的所有资源添加 CORS 标头。

apacheconf
<IfModule mod_headers.c>
  Header set Access-Control-Allow-Origin "*"
</IfModule>

除非您在以后的配置中或在设置此指令的目录下方的目录的配置中覆盖该指令,否则将满足来自外部服务器的每个请求,这不太可能是您想要的。

一种替代方法是明确说明哪些域名可以访问您网站的内容。在下面的示例中,我们将访问权限限制到我们主站点的子域名 (example.com)。这更安全,也可能是您想要执行的操作。

apacheconf
<IfModule mod_headers.c>
  Header set Access-Control-Allow-Origin "subdomain.example.com"
</IfModule>

跨源图像

Chromium 博客 中所述并在 允许跨源使用图像和画布 中记录的那样,可能会导致 指纹识别 攻击。

为了减轻这些攻击的可能性,您应该在您请求的图像中使用 crossorigin 属性,并在您的 .htaccess 中使用下面的代码片段来设置服务器的 CORS 标头。

apacheconf
<IfModule mod_setenvif.c>
  <IfModule mod_headers.c>
    <FilesMatch "\.(bmp|cur|gif|ico|jpe?g|a?png|svgz?|webp|heic|heif|avif)$">
      SetEnvIf Origin ":" IS_CORS
      Header set Access-Control-Allow-Origin "*" env=*IS_CORS*
    </FilesMatch>
  </IfModule>
</IfModule>

Google Chrome 的 Google Fonts 故障排除指南 告诉我们,虽然 Google Fonts 可能会在每个响应中发送 CORS 标头,但某些代理服务器可能会在浏览器能够使用它来呈现字体之前将其剥离。

apacheconf
<IfModule mod_headers.c>
  <FilesMatch "\.(eot|otf|tt[cf]|woff2?)$">
    Header set Access-Control-Allow-Origin "*"
  </FilesMatch>
</IfModule>

跨源资源计时

资源计时级别 1 规范定义了一个接口,供 Web 应用程序访问文档中资源的完整计时信息。

Timing-Allow-Origin 响应标头指定允许查看通过资源计时 API 的功能检索到的属性值的来源,否则这些属性将由于跨源限制而报告为零。

如果资源没有使用 Timing-Allow-Origin 提供服务,或者标头在发出请求后不包含来源,则 PerformanceResourceTiming 对象的某些属性将设置为零。

apacheconf
<IfModule mod_headers.c>
  Header set Timing-Allow-Origin: "*"
</IfModule>

自定义错误页面/消息

Apache 允许您根据用户收到的错误类型为用户提供自定义错误页面。

错误页面以 URL 形式呈现。这些 URL 可以以斜杠 (/) 开头表示本地 Web 路径(相对于 DocumentRoot),也可以是客户端可以解析的完整 URL。

有关更多信息,请参阅 HTTPD 文档站点上的 ErrorDocument 指令 文档。

apacheconf
ErrorDocument 500 /errors/500.html
ErrorDocument 404 /errors/400.html
ErrorDocument 401 https://example.com/subscription_info.html
ErrorDocument 403 "Sorry, can't allow you access today."

错误预防

此设置会影响 MultiViews 对配置适用的目录的工作方式。

MultiViews 的效果如下:如果服务器收到对 /some/dir/foo 的请求,如果 /some/dir 已启用 MultiViews,并且 /some/dir/foo 不存在,则服务器读取目录以查找名为 foo.* 的文件,并有效地伪造一个类型映射,其中命名所有这些文件,并为它们分配与客户端按名称请求其中一个文件时相同的媒体类型和内容编码。然后,它选择最符合客户端要求的匹配项。

该设置会禁用此配置适用的目录的 MultiViews,并防止 Apache 在同名目录不存在时返回 404 错误作为重写结果。

apacheconf
Options -MultiViews

媒体类型和字符编码

Apache 使用 mod_mime 将内容元数据分配给 HTTP 响应为其选择的内容,方法是将 URI 或文件名中的模式映射到元数据值。

例如,内容文件的扩展名通常定义内容的 Internet 媒体类型、语言、字符集和内容编码。此信息发送在包含该内容的 HTTP 消息中,并在选择备选方案时用于内容协商,以便在选择要提供的多个可能内容之一时尊重用户的偏好。

更改文件的元数据不会更改 Last-Modified 标头的值。因此,客户端或代理可能仍然使用以前的标头使用先前缓存的副本。如果更改元数据(语言、内容类型、字符集或编码),则可能需要“touch”受影响的文件(更新其上次修改日期),以确保所有访问者都收到更正的内容标头。

使用正确的媒体类型(又名 MIME 类型)提供资源

将媒体类型与一个或多个扩展名关联,以确保资源将被适当地提供。

HTML 规范 中所述,服务器应为 JavaScript 资源使用 text/javascript

apacheconf
<IfModule mod_mime.c>
  # Data interchange
    AddType application/atom+xml      atom
    AddType application/json          json map topojson
    AddType application/ld+json       jsonld
    AddType application/rss+xml       rss
    AddType application/geo+json      geojson
    AddType application/rdf+xml       rdf
    AddType application/xml           xml
  # JavaScript
    AddType text/javascript           js mjs
  # Manifest files
    AddType application/manifest+json     webmanifest
    AddType application/x-web-app-manifest+json         webapp
    AddType text/cache-manifest           appcache
  # Media files
    AddType audio/mp4                     f4a f4b m4a
    AddType audio/ogg                     oga ogg opus
    AddType image/bmp                     bmp
    AddType image/svg+xml                 svg svgz
    AddType image/webp                    webp
    AddType video/mp4                     f4v f4p m4v mp4
    AddType video/ogg                     ogv
    AddType video/webm                    webm
    AddType image/x-icon    cur ico
  # HEIF Images
    AddType image/heic                    heic
    AddType image/heif                    heif
  # HEIF Image Sequence
    AddType image/heics                   heics
    AddType image/heifs                   heifs
  # AVIF Images
    AddType image/avif                    avif
  # AVIF Image Sequence
    AddType image/avis                    avis
  # WebAssembly
    AddType application/wasm              wasm
  # Web fonts
    AddType font/woff                         woff
    AddType font/woff2                        woff2
    AddType application/vnd.ms-fontobject                eot
    AddType font/ttf                          ttf
    AddType font/collection                   ttc
    AddType font/otf                          otf
  # Other
    AddType application/octet-stream          safariextz
    AddType application/x-bb-appworld         bbaw
    AddType application/x-chrome-extension    crx
    AddType application/x-opera-extension     oex
    AddType application/x-xpinstall           xpi
    AddType text/calendar                     ics
    AddType text/markdown                     markdown md
    AddType text/vcard                        vcard vcf
    AddType text/vnd.rim.location.xloc        xloc
    AddType text/vtt                          vtt
    AddType text/x-component                  htc
</IfModule>

设置默认 charset 属性

Web 上的每一部分内容都有一个字符集。大多数(如果不是全部)内容都是 UTF-8 Unicode。

使用 AddDefaultCharsetUTF-8 字符集提供所有标记为 text/htmltext/plain 的资源。

apacheconf
<IfModule mod_mime.c>
  AddDefaultCharset utf-8
</IfModule>

为特定媒体类型设置字符集

使用 mod_mime 中可用的 AddCharset 指令,将以下文件类型与设置为 UTF-8charset 参数一起提供。

apacheconf
<IfModule mod_mime.c>
  AddCharset utf-8 .appcache \
    .bbaw \
    .css \
    .htc \
    .ics \
    .js \
    .json \
    .manifest \
    .map \
    .markdown \
    .md \
    .mjs \
    .topojson \
    .vtt \
    .vcard \
    .vcf \
    .webmanifest \
    .xloc
</IfModule>

Mod_rewriteRewriteEngine 指令

mod_rewrite 提供了一种根据正则表达式规则动态修改传入 URL 请求的方法。这使您可以将任意 URL 映射到您的内部 URL 结构中的任何位置。

它支持无限数量的规则和每个规则的无限数量的附加规则条件,以提供真正灵活且强大的 URL 操作机制。URL 操作可以依赖于各种测试:服务器变量、环境变量、HTTP 标头、时间戳、外部数据库查找以及各种其他外部程序或处理程序,可用于实现细粒度的 URL 匹配。

启用 mod_rewrite

启用 mod_rewrite 的基本模式是使用它的所有其他任务的先决条件。

所需步骤为

  1. 打开重写引擎(这是为了使 RewriteRule 指令能够工作所必需的),如 RewriteEngine 文档中所述。
  2. 如果尚未启用 FollowSymLinks 选项,请启用它。请参阅 核心选项 文档。
  3. 如果您的 Web 主机不允许 FollowSymlinks 选项,则需要将其注释掉或删除,然后取消注释 Options +SymLinksIfOwnerMatch 行,但请注意 性能影响
apacheconf
<IfModule mod_rewrite.c>
  RewriteEngine On
  Options +FollowSymlinks
  # Options +SymLinksIfOwnerMatch
  # RewriteBase /
  # RewriteOptions <options>
</IfModule>

强制使用 HTTPS

这些重写规则将从不安全的 http:// 版本重定向到 URL 的安全的 https:// 版本,如 Apache HTTPD wiki 中所述。

apacheconf
<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteCond %{HTTPS} !=on
  RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R,L]
</IfModule>

如果您使用 cPanel AutoSSL 或 Let's Encrypt Webroot 方法创建 TLS 证书,如果验证请求重定向到 HTTPS,则它将无法验证证书。启用您需要的条件。

apacheconf
<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteCond %{HTTPS} !=on
  RewriteCond %{REQUEST_URI} !^/\.well-known/acme-challenge/
  RewriteCond %{REQUEST_URI} !^/\.well-known/cpanel-dcv/[\w-]+$
  RewriteCond %{REQUEST_URI} !^/\.well-known/pki-validation/[A-F0-9]{32}\.txt(?:\ Comodo\ DCV)?$
  RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
</IfModule>

www. URL 重定向

这些指令将 www.example.com 重写为 example.com

您不应该在多个来源(带和不带 www)中复制内容。这可能导致 SEO 问题(重复内容),因此,您应该选择其中一个替代方案并重定向另一个。您还应该使用规范 URL来指示搜索引擎应该抓取哪个 URL(如果它们支持此功能)。

设置%{ENV:PROTO}变量,以允许重写自动使用适当的方案(httphttps)进行重定向。

该规则默认假设 HTTP 和 HTTPS 环境都可用于重定向。

apacheconf
<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteCond %{HTTPS} =on
  RewriteRule ^ - [E=PROTO:https]
  RewriteCond %{HTTPS} !=on
  RewriteRule ^ - [E=PROTO:http]

  RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
  RewriteRule ^ %{ENV:PROTO}://%1%{REQUEST_URI} [R=301,L]
</IfModule>

在 URL 开头插入www.

这些规则将在 URL 开头插入www.。需要注意的是,您永远不应该在两个不同的 URL 下提供相同的内容。

这可能导致 SEO 问题(重复内容),因此,您应该选择其中一个替代方案并重定向另一个。对于支持规范 URL 的搜索引擎,您应该使用规范 URL来指示搜索引擎应该抓取哪个 URL。

设置%{ENV:PROTO}变量,以允许重写自动使用适当的方案(httphttps)进行重定向。

该规则默认假设 HTTP 和 HTTPS 环境都可用于重定向。如果您的 TLS 证书无法处理重定向期间使用的其中一个域名,则应启用该条件。

如果您对网站的某些部分使用“真实”子域名,则以下方法可能不是一个好主意。

apacheconf
<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteCond %{HTTPS} =on
  RewriteRule ^ - [E=PROTO:https]
  RewriteCond %{HTTPS} !=on
  RewriteRule ^ - [E=PROTO:http]

  RewriteCond %{HTTPS} !=on

  RewriteCond %{HTTP_HOST} !^www\. [NC]
  RewriteCond %{SERVER_ADDR} !=127.0.0.1
  RewriteCond %{SERVER_ADDR} !=::1
  RewriteRule ^ %{ENV:PROTO}://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
</IfModule>

框架选项

以下示例发送X-Frame-Options响应头,其值为 DENY,通知浏览器不要在任何框架中显示网页内容,以保护网站免受点击劫持攻击。

这可能不是每个人都适用的最佳设置。您应该阅读有关X-Frame-Options头的另外两个可能值SAMEORIGINALLOW-FROM

虽然您可以为网站的所有页面发送X-Frame-Options头,但这可能存在一个缺点,即它甚至禁止对您的内容进行任何框架化(例如:当用户使用 Google 图片搜索结果页面访问您的网站时)。

但是,您应该确保为所有允许用户执行状态更改操作的页面发送X-Frame-Options头(例如:包含一键购买链接、结账或银行转账确认页面、进行永久配置更改的页面等)。

apacheconf
<IfModule mod_headers.c>
  Header always set X-Frame-Options "DENY" "expr=%{CONTENT_TYPE} =~ m#text/html#i"
</IfModule>

内容安全策略 (CSP)

CSP(内容安全策略)通过设置Content Security Policy来降低跨站点脚本和其他内容注入攻击的风险,该策略允许网站内容的受信任来源。

没有一个策略适合所有网站,以下示例旨在作为您修改网站的指南。

为了使您的 CSP 实现更容易,您可以使用在线CSP 头生成器。您还应该使用验证器来确保您的头执行您想要的操作。

apacheconf
<IfModule mod_headers.c>
  Content-Security-Policy "default-src 'self'; base-uri 'none'; form-action 'self'; frame-ancestors 'none'; upgrade-insecure-requests" "expr=%{CONTENT_TYPE} =~ m#text\/(html|javascript)|application\/pdf|xml#i"
</IfModule>

目录访问

此指令将阻止访问在服务器配置的任何格式(如index.htmlindex.php)中不存在索引文件的目录。

apacheconf
<IfModule mod_autoindex.c>
    Options -Indexes
</IfModule>

阻止访问隐藏文件和目录

在 Macintosh 和 Linux 系统中,以句点开头的文件对用户隐藏,但如果您知道其名称和位置,则不会被阻止访问。这些类型的文件通常包含用户首选项或实用程序的保留状态,并且可能包含相当私密的位置,例如.git.svn目录。

.well-known/目录表示“众所周知位置”的标准(RFC 5785)路径前缀(例如:/.well-known/manifest.json/.well-known/keybase.txt),因此,不应阻止对其可见内容的访问。

apacheconf
<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{REQUEST_URI} "!(^|/)\.well-known/([^./]+./?)+$" [NC]
    RewriteCond %{SCRIPT_FILENAME} -d [OR]
    RewriteCond %{SCRIPT_FILENAME} -f
    RewriteRule "(^|/)\." - [F]
</IfModule>

阻止访问包含敏感信息的文

阻止访问某些文本编辑器可能留下的备份和源文件,这些文件在任何人都可以访问时都可能构成安全风险。

更新以下示例中的<FilesMatch>正则表达式,以包含可能最终出现在生产服务器上并可能泄露有关您网站的敏感信息的任何文件。这些文件可能包括配置文件或包含有关项目元数据的文件等。

apacheconf
<IfModule mod_authz_core.c>
  <FilesMatch "(^#.*#|\.(bak|conf|dist|fla|in[ci]|log|orig|psd|sh|sql|sw[op])|~)$">
    Require all denied
  </FilesMatch>
</IfModule>

HTTP 严格传输安全 (HSTS)

如果用户在浏览器中输入example.com,即使服务器将其重定向到网站的安全版本,这仍然会为攻击者提供一个机会窗口(初始 HTTP 连接)来降级或重定向请求。

以下头确保浏览器仅通过 HTTPS 连接到您的服务器,无论用户在浏览器地址栏中输入什么。

请注意,严格传输安全不可撤销,您必须确保能够在您在max-age指令中指定的时间内通过 HTTPS 提供服务。如果您不再拥有有效的 TLS 连接(例如,由于 TLS 证书过期),即使尝试通过 HTTP 连接,您的访问者也会看到错误消息。

apacheconf
<IfModule mod_headers.c>
  # Header always set
  Strict-Transport-Security "max-age=16070400; includeSubDomains" "expr=%{HTTPS} == 'on'"
  # (1) Enable your site for HSTS preload inclusion.
  # Header always set
  Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" "expr=%{HTTPS} == 'on'"
</IfModule>

防止某些浏览器对响应进行 MIME 嗅探

  1. 通过将default-src指令设置为'self'来默认限制所有提取到当前网站的来源 - 作为所有提取指令的回退。
    • 这很方便,因为您不必指定适用于您网站的所有提取指令,例如:connect-src 'self'; font-src 'self'; script-src 'self'; style-src 'self'等。
    • 此限制还意味着您必须明确定义允许您的网站从中加载资源的站点。否则,它将被限制为与发出请求的页面相同的来源。
  2. 不允许网站上的<base>元素。这是为了防止攻击者更改从相对 URL 加载的资源的位置。
    • 如果要使用<base>元素,则使用base-uri 'self'代替。
  3. 仅允许来自当前来源的表单提交:form-action 'self'
  4. 通过设置frame-ancestors 'none',防止所有网站(包括您自己的网站)将您的网页嵌入到例如<iframe><object>元素中。
    • frame-ancestors指令有助于避免点击劫持攻击,类似于X-Frame-Options头。
    • 如果也指定了frame-ancestors,则支持 CSP 头的浏览器将忽略X-Frame-Options
  5. 通过设置upgrade-insecure-requests指令,强制浏览器将通过 HTTP 提供的所有资源视为通过 HTTPS 安全加载。
    • upgrade-insecure-requests不确保顶级导航的 HTTPS。如果要强制网站本身通过 HTTPS 加载,则必须包含Strict-Transport-Security头。
  6. 在能够执行脚本的所有响应中包含Content-Security-Policy头。这包括常用的文件类型:HTML、XML 和 PDF 文档。尽管 JavaScript 文件无法在“浏览上下文”中执行脚本,但它们被包含在内以针对Web 工作线程

一些较旧的浏览器会尝试猜测资源的内容类型,即使它在服务器配置中没有正确设置。这减少了遭受驱动下载攻击和跨源数据泄露的风险。

apacheconf
<IfModule mod_headers.c>
    Header always set X-Content-Type-Options "nosniff"
</IfModule>

Referrer 策略

我们在能够请求(或导航到)其他资源的资源的响应中包含Referrer-Policy头。

这包括常用的资源类型:HTML、CSS、XML/SVG、PDF 文档、脚本和工作线程。

要完全防止推荐人泄漏,请指定no-referrer值。请注意,此效果可能会对分析工具产生负面影响。

使用以下服务检查您的Referrer-Policy

apacheconf
<IfModule mod_headers.c>
  Header always set Referrer-Policy "strict-origin-when-cross-origin" "expr=%{CONTENT_TYPE} =~ m#text\/(css|html|javascript)|application\/pdf|xml#i"
</IfModule>

禁用 TRACE HTTP 方法

TRACE方法虽然看似无害,但在某些情况下可以成功利用来窃取合法用户的凭据。请参阅跨站点跟踪 (XST) 攻击OWASP Web 安全测试指南

现代浏览器现在阻止通过 JavaScript 发出的 TRACE 请求,但是,已经发现了使用浏览器发送 TRACE 请求的其他方法,例如使用 Java。

如果您有权访问主服务器配置文件,请改用TraceEnable指令。

apacheconf
<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteCond %{REQUEST_METHOD} ^TRACE [NC]
  RewriteRule .* - [R=405,L]
</IfModule>

删除 X-Powered-By 响应头

某些框架(如 PHP 和 ASP.NET)设置一个X-Powered-By头,其中包含有关它们的信息(例如,名称、版本号)。

此头没有任何价值,在某些情况下,它提供的信息可能会暴露漏洞。

apacheconf
<IfModule mod_headers.c>
  Header unset X-Powered-By
  Header always unset X-Powered-By
</IfModule>

如果可以,您应该在语言/框架级别禁用X-Powered-By头(例如:对于 PHP,您可以在php.ini中设置以下内容)。

ini
expose_php = off;

防止 Apache 在服务器生成的文档(例如错误消息、目录列表等)中添加包含有关服务器信息的尾随脚注行。有关服务器签名提供的内容的更多信息,请参阅ServerSignature指令文档,以及有关配置签名中提供的信息的ServerTokens指令

apacheconf
ServerSignature Off

修复损坏的 AcceptEncoding

某些代理和安全软件会修改或剥离Accept-EncodingHTTP 头。有关更详细的解释,请参阅超越 Gzipping

apacheconf
<IfModule mod_deflate.c>
  <IfModule mod_setenvif.c>
    <IfModule mod_headers.c>
      SetEnvIfNoCase ^(Accept-EncodXng|X-cept-Encoding|X{15}|~{15}|-{15})$ ^((gzip|deflate)\s*,?\s*)+|[X~-]{4,13}$ HAVE_Accept-Encoding
      RequestHeader append Accept-Encoding "gzip,deflate" env=HAVE_Accept-Encoding
    </IfModule>
  </IfModule>
</IfModule>

压缩媒体类型

使用AddOutputFilterByType 指令压缩所有使用以下媒体类型之一标记的输出。

apacheconf
<IfModule mod_deflate.c>
  <IfModule mod_filter.c>
    AddOutputFilterByType DEFLATE "application/atom+xml" \
      "application/javascript" \
      "application/json" \
      "application/ld+json" \
      "application/manifest+json" \
      "application/rdf+xml" \
      "application/rss+xml" \
      "application/schema+json" \
      "application/geo+json" \
      "application/vnd.ms-fontobject" \
      "application/wasm" \
      "application/x-font-ttf" \
      "application/x-javascript" \
      "application/x-web-app-manifest+json" \
      "application/xhtml+xml" \
      "application/xml" \
      "font/eot" \
      "font/opentype" \
      "font/otf" \
      "font/ttf" \
      "image/bmp" \
      "image/svg+xml" \
      "image/vnd.microsoft.icon" \
      "text/cache-manifest" \
      "text/calendar" \
      "text/css" \
      "text/html" \
      "text/javascript" \
      "text/plain" \
      "text/markdown" \
      "text/vcard" \
      "text/vnd.rim.location.xloc" \
      "text/vtt" \
      "text/x-component" \
      "text/x-cross-domain-policy" \
      "text/xml"
  </IfModule>
</IfModule>

将扩展名映射到媒体类型

使用AddEncoding将以下文件名扩展名映射到指定的编码类型,以便 Apache 可以使用适当的Content-Encoding响应头提供文件类型(这不会使 Apache 压缩它们!)。如果这些文件类型在没有适当的Content-Encoding响应头的情况下提供服务,则客户端应用程序(例如浏览器)将不知道它们首先需要解压缩响应,因此将无法理解内容。

apacheconf
<IfModule mod_deflate.c>
  <IfModule mod_mime.c>
    AddEncoding gzip svgz
  </IfModule>
</IfModule>

缓存过期

使用mod_expires模块以及Cache-ControlExpires头,为资源提供远期过期日期。

apacheconf
<IfModule mod_expires.c>
    ExpiresActive on
    ExpiresDefault                                      "access plus 1 month"

  # CSS
    ExpiresByType text/css                              "access plus 1 year"
  # Data interchange
    ExpiresByType application/atom+xml                  "access plus 1 hour"
    ExpiresByType application/rdf+xml                   "access plus 1 hour"
    ExpiresByType application/rss+xml                   "access plus 1 hour"
    ExpiresByType application/json                      "access plus 0 seconds"
    ExpiresByType application/ld+json                   "access plus 0 seconds"
    ExpiresByType application/schema+json               "access plus 0 seconds"
    ExpiresByType application/geo+json                  "access plus 0 seconds"
    ExpiresByType application/xml                       "access plus 0 seconds"
    ExpiresByType text/calendar                         "access plus 0 seconds"
    ExpiresByType text/xml                              "access plus 0 seconds"
  # Favicon (cannot be renamed!) and cursor images
    ExpiresByType image/vnd.microsoft.icon              "access plus 1 week"
    ExpiresByType image/x-icon                          "access plus 1 week"
  # HTML
    ExpiresByType text/html                             "access plus 0 seconds"
  # JavaScript
    ExpiresByType text/javascript                       "access plus 1 year"
  # Manifest files
    ExpiresByType application/manifest+json             "access plus 1 week"
    ExpiresByType application/x-web-app-manifest+json   "access plus 0 seconds"
    ExpiresByType text/cache-manifest                   "access plus 0 seconds"
  # Markdown
    ExpiresByType text/markdown                         "access plus 0 seconds"
  # Media files
    ExpiresByType audio/ogg                             "access plus 1 month"
    ExpiresByType image/bmp                             "access plus 1 month"
    ExpiresByType image/gif                             "access plus 1 month"
    ExpiresByType image/jpeg                            "access plus 1 month"
    ExpiresByType image/svg+xml                         "access plus 1 month"
    ExpiresByType image/webp                            "access plus 1 month"
    # PNG and animated PNG
    ExpiresByType image/apng                            "access plus 1 month"
    ExpiresByType image/png                             "access plus 1 month"
    # HEIF Images
    ExpiresByType image/heic                            "access plus 1 month"
    ExpiresByType image/heif                            "access plus 1 month"
    # HEIF Image Sequence
    ExpiresByType image/heics                           "access plus 1 month"
    ExpiresByType image/heifs                           "access plus 1 month"
    # AVIF Images
    ExpiresByType image/avif                            "access plus 1 month"
    # AVIF Image Sequence
    ExpiresByType image/avis                            "access plus 1 month"
    ExpiresByType video/mp4                             "access plus 1 month"
    ExpiresByType video/ogg                             "access plus 1 month"
    ExpiresByType video/webm                            "access plus 1 month"
  # WebAssembly
    ExpiresByType application/wasm                      "access plus 1 year"
  # Web fonts
    # Collection
    ExpiresByType font/collection                       "access plus 1 month"
    # Embedded OpenType (EOT)
    ExpiresByType application/vnd.ms-fontobject         "access plus 1 month"
    ExpiresByType font/eot                              "access plus 1 month"
    # OpenType
    ExpiresByType font/opentype                         "access plus 1 month"
    ExpiresByType font/otf                              "access plus 1 month"
    # TrueType
    ExpiresByType application/x-font-ttf                "access plus 1 month"
    ExpiresByType font/ttf                              "access plus 1 month"
    # Web Open Font Format (WOFF) 1.0
    ExpiresByType application/font-woff                 "access plus 1 month"
    ExpiresByType application/x-font-woff               "access plus 1 month"
    ExpiresByType font/woff                             "access plus 1 month"
    # Web Open Font Format (WOFF) 2.0
    ExpiresByType application/font-woff2                "access plus 1 month"
    ExpiresByType font/woff2                            "access plus 1 month"
  # Other
    ExpiresByType text/x-cross-domain-policy            "access plus 1 week"
</IfModule>