.htaccess 生成器,免费
为常见的服务器配置生成 Apache .htaccess 规则。
强制 HTTPS
强制 WWW / 非 WWW
安全头
GZIP 压缩
浏览器缓存
自定义错误页
目录选项
生成的 .htaccess 文件
什么是 .htaccess?
.htaccess 文件是 Apache Web 服务器的配置文件。它允许您设置 URL 重定向、安全头、缓存规则等 · 无需修改服务器主配置。
常见问题
.htaccess 文件放在哪里?
将它放在网站的根目录(通常是 public_html 或 www)。规则适用于该目录及其所有子目录。
它能在 Nginx 上使用吗?
不能。.htaccess 是 Apache 特有的。Nginx 使用自己的配置语法,写在 nginx.conf 或站点配置文件中。
.htaccess 会让我的站点变慢吗?
Apache 会在每次请求时读取 .htaccess,因此非常大的文件会带来额外开销。对于高流量站点,将规则迁移到 Apache 主配置中会更快。
.htaccess文件的本质
.htaccess文件是Apache的逐目录配置文件。该名称通常被理解为「hypertext access」(超文本访问)的缩写,反映了该文件最初限制超文本文档访问的主要用途。将其放置在任意目录中,指令即适用于该目录及其所有子目录。该文件点号前没有文件名(这是Unix的隐藏点文件),且必须严格命名为 .htaccess(小写字母、前置圆点),Apache才能在默认 AccessFileName 设置下找到它。
这会带来真实的性能代价。Apache官方文档明确指出:「如果AllowOverride被设置为允许使用.htaccess文件,Apache将在每个目录中查找.htaccess文件。因此,允许使用.htaccess文件会造成性能损耗,无论您是否真正使用它们。」目录树会在每次HTTP请求时被遍历。对于向 /var/www/html/foo/bar/baz.html 发起的请求,Apache会依次stat检查 /.htaccess、/var/.htaccess、/var/www/.htaccess、/var/www/html/.htaccess 等是否存在,即便这些文件都不存在也不例外。Apache自身的建议是:在可能的情况下使用主配置中的 <Directory> 块(在启动时解析一次),仅在无法访问主配置的托管环境中才使用 .htaccess。
何时需要(以及何时不需要)它
Apache列举了两种使用 .htaccess 的合理场景:一是托管服务商在不给予完整服务器配置访问权限的情况下为用户提供有限控制;二是指令需要在子目录间有所不同而部署者仅能控制文件系统的情况。除此之外,官方文档明确建议将规则移至主配置中的 <Directory> 块。
nginx(第二流行的Web服务器)完全不支持.htaccess;它出于性能原因故意拒绝逐目录配置文件,所有配置均集中在 nginx.conf 及其包含的站点文件中。如果您的项目使用nginx,本生成器的输出将无效,您需要在nginx配置文件中使用server/location块。Caddy使用其独有的Caddyfile语法,默认通过Let's Encrypt自动提供HTTPS。LiteSpeed和OpenLiteSpeed支持 .htaccess 以兼容Apache。IIS使用 web.config。
URL重写与标准HTTPS跳转模式
大多数非简单的 .htaccess 工作使用mod_rewrite,这是Apache基于POSIX扩展正则表达式的规则驱动URL重写引擎。基本语法结构为 RewriteRule pattern substitution [flags],前面可选择性地添加一个或多个 RewriteCond 条件。标准强制HTTPS跳转块如下:
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
[L,R=301] 标志的含义是「本轮次中这是最后一条规则」和「响应HTTP 301 Moved Permanently」。301适用于永久跳转,搜索引擎会传递链接权重,浏览器也会积极缓存。仅在确实是临时跳转(即不希望缓存该移动操作)的情况下使用302(Found)。
在终止TLS的负载均衡器或反向代理后面,源服务器接收到的是纯HTTP请求,即使用户浏览器使用的是HTTPS,简单的 RewriteCond %{HTTPS} off 规则此时会造成无限跳转循环。解决办法是改为检查转发头:RewriteCond %{HTTP:X-Forwarded-Proto} !https。Cloudflare的「灵活SSL」模式(CDN以HTTP与源站通信,而用户浏览器使用HTTPS)是造成这种跳转循环陷阱最常见的原因。
使用类似模式在www与非www规范化之间进行选择。出于SEO目的(避免重复内容问题)和Cookie作用域(默认情况下 www 子域名与顶级域名接收不同的Cookie),应选择一个规范主机名。
压缩与缓存
mod_deflate对文本响应进行gzip压缩,能大幅减少text/HTML/CSS/JS的传输体积。将该块包裹在 <IfModule mod_deflate.c> 中,以避免在未加载该模块的服务器上导致站点崩溃。Brotli(mod_brotli)是现代替代方案,使用相同模式。
mod_expires设置 Expires 和 Cache-Control: max-age 响应头。广泛使用的「access plus 1 year」语法表示资源可从用户获取时起缓存一年。长max-age适用于带哈希值的资源文件名(如 app.abc123.js);较短的max-age适用于HTML及任何可变内容。对于更精细的控制,在哈希文件上使用 Header set Cache-Control "public, max-age=31536000, immutable" 是现代最佳实践。
值得了解的安全响应头
- X-Frame-Options: SAMEORIGIN:防止页面被其他来源的
<iframe>嵌入。已基本被CSP的frame-ancestors取代。 - Content-Security-Policy:现代防御XSS和点击劫持的主要手段。入门配置:
default-src 'self'; img-src 'self' data:; style-src 'self' 'unsafe-inline'; script-src 'self'。逐步收紧。 - Strict-Transport-Security(HSTS):告知浏览器对您的域名始终仅使用HTTPS通信。
max-age=31536000; includeSubDomains是典型基准。仅在确认HTTPS永久启用时才添加preload,一旦预加载到浏览器HSTS列表,撤销将非常困难。 - X-Content-Type-Options: nosniff:防止浏览器对
Content-Type响应头进行二次猜测。该响应头只有一个有效值。 - Referrer-Policy: strict-origin-when-cross-origin:现代默认值;对同源请求发送完整URL,对跨域请求仅发送来源,在HTTPS降级到HTTP时不发送任何内容。
- Permissions-Policy:控制摄像头、麦克风、地理位置等浏览器功能。取代了旧版Feature-Policy响应头。
- X-XSS-Protection:已基本废弃。该过滤器已从Chrome中移除,Firefox也从未实现;现代安全依赖CSP。许多旧版指南仍为旧版IE保留此配置,新站点可安全省略。
隐藏不应被访问的文件
两个安全加固单行指令可大大提升安全性:
Options -Indexes:当目录中没有index.html时,禁用自动生成的目录列表。许多发行版默认开启目录索引功能;一个不小心暴露的未受保护目录不应向网络泄露其内容。- 屏蔽点文件和版本控制元数据。在
<FilesMatch "^(\.htaccess|\.htpasswd|\.env|\.git.*)$">块中添加Require all denied,可阻止攻击者下载.env(通常包含数据库密码和API密钥)或.git/config(暴露远程URL及凭证)。Akamai和SANS威胁报告将.env泄露列为2020年代最常见的应用层数据泄露之一。
Apache 2.4将旧版 Order Allow,Deny 语法替换为更简洁的 Require 指令系列:Require all granted、Require all denied、Require ip 192.0.2.0/24、Require not ip 198.51.100.5。旧语法出于向后兼容性仍然有效,但官方文档已将其标记为废弃。
常见陷阱
- 必须在服务器层面启用mod_rewrite。在Debian/Ubuntu上:
sudo a2enmod rewrite && sudo systemctl restart apache2。若未启用,每条RewriteRule都会被静默跳过。 - AllowOverride至关重要。如果主配置设置了
AllowOverride None(针对您的<Directory>),您的.htaccess中的每条指令都会被静默忽略。AllowOverride All允许所有指令;AllowOverride FileInfo AuthConfig仅允许重写和认证指令,对大多数使用场景已经足够。 - 一个错别字就会使整个站点崩溃。Apache对受影响目录树的每个请求都会返回500 Internal Server Error,直到文件被修复。请务必先在预发布环境测试;保留一份名为
.htaccess.bak的备份副本;准备好SSH/FTP访问权限以便远程重命名损坏的文件。查看/var/log/apache2/error.log获取语法错误信息。 - 无限跳转循环。浏览器会在约20次跳转后停止并显示
ERR_TOO_MANY_REDIRECTS。最常见的原因:在TLS终止代理后面的服务器上运行HTTPS跳转规则(使用%{HTTP:X-Forwarded-Proto});www和HTTPS规则顺序错误导致双重跳转;Cloudflare灵活SSL模式。 [L]标志会以重写后的URL从顶部重新运行重写引擎。如果后续规则又匹配上,行为可能出人意料。当您真正需要硬性停止时,请使用[END](Apache 2.3.9+)。- 逐目录上下文中会去掉前导斜杠。在
.htaccess中,RewriteRule ^index\.html$ home.html能匹配;而RewriteRule ^/index\.html$则无法匹配。这会让所有从主配置示例中复制规则的用户都掉入这个陷阱。 - 某些指令在.htaccess中被禁止:
<VirtualHost>、<Directory>、<Location>、Listen、ServerName均仅限主配置使用。逐目录配置文件已隐式适用于其所在目录。
更多问题
文件应该放在哪里?
放在您希望控制其内容的目录中。大多数共享主机用户将其放在站点的文档根目录,根据主机不同,可能是 public_html/、www/ 或 htdocs/。Apache随后会遍历目录树,将规则应用于该目录及其所有子目录。
301还是302,应该用哪种跳转?
301 Moved Permanently用于永久移动。搜索引擎会将链接权重传递给新URL;浏览器会积极缓存跳转。适用于「此页面已永久移走」的情况。302 Found用于临时跳转,浏览器不会缓存,搜索引擎不会转移排名。仅在移动确实是临时性的情况下使用302;将302作为默认选项而非301是最常见的SEO失误之一。
如何对目录进行密码保护?
创建一个 .htpasswd 文件(使用 htpasswd 命令行工具,存储 username:bcrypt-hash 格式的行),并将其保存在Web根目录之外。然后在 .htaccess 中设置:AuthType Basic、AuthName "Restricted Area"、AuthUserFile /full/path/to/.htpasswd、Require valid-user。浏览器会向访问该目录的任何用户显示系统Basic认证弹窗。这是经典的Apache模式;对于正式的认证需求,建议考虑应用层登录系统。
WordPress是否适用?
WordPress自带其 .htaccess 块(在 # BEGIN WordPress 和 # END WordPress 标记之间),用于处理固定链接。当您保存固定链接设置时,WordPress会覆盖这些标记内的任何内容。请将您自己的规则添加在WordPress标记之外(通常在其上方),以使规则在自动重新生成时得以保留。
有任何内容会发送至服务器吗?
不会。生成器是一段JavaScript,根据您的复选框选择拼装指令块;输出内容在您的浏览器中构建。您的域名或所选选项均不会离开页面;页面加载后即可离线使用。