.htaccess 是一个简单的文本文件,用于控制 Web 服务器处理请求的方式。它最初设计用于管理目录访问权限,但现在它有许多其他用途。
本指南并未深入探讨 .htaccess 而是一个实用的介绍,其中包含一些有用的代码片段。虽然 .htaccess 虽然它功能强大,但这并不意味着你应该把它用在所有事情上。了解何时以及如何应用它可以提升你网站的安全性、性能和功能。
什么是 .htaccess?
这个 .htaccess 文件是“超文本访问”的缩写,是主要用于 Apache 服务器。它允许用户控制访问权限、密码保护目录、设置重定向、自定义错误页面以及阻止特定的 IP 地址。
与 .htpasswd 文件配合使用,可以实现对多个用户的精细目录访问控制。许多托管服务提供商支持 .htaccess,但它并不通用——一些 Web 服务器(如 Nginx)使用不同的方法。
在哪里可以找到你的 .htaccess 文件?
默认情况下, .htaccess 文件在 cPanel 的文件管理器和其他主机控制面板中是隐藏的。您可以在文件管理器设置中启用“显示隐藏文件”选项来显示它。
如果您找不到该文件,请不要慌张——它可能还不存在。大多数情况下,它应该位于您网站的根目录中,通常名为 public_html 或 www。如果您在同一个托管账户下管理多个网站,则每个网站可能都有自己的 .htaccess 文件位于其各自的文件夹中。
大多数以句点 (.) 开头的系统文件都是隐藏的。如果您的 .htaccess 文件不可见,请检查您的托管设置或在文本编辑器中手动创建一个。
您的 .htaccess cPanel 文件管理器默认隐藏该文件。您可以通过配置文件管理器设置来显示它。
.htaccess 备忘单和代码示例
而 .htaccess 可以做很多事情,掌握正确的命令至关重要。为了方便起见,我们整理了一份速查表,列出了最常用的 .htaccess 规则。无论你是否需要阻止恶意机器人,强制 HTTPS自定义错误页面或改进 SEO,您会在下面找到可立即使用的代码片段。
只需复制、粘贴并进行调整即可满足您的需求。让我们开始吧!
备注:请在使用任何规则前仔细检查并核实。我们对可能出现的任何问题概不负责——使用风险自负。此外,大多数规则都要求 RewriteEngine On 在你的指令 .htaccess 文件才能正常运行。
重写和重定向规则
用一个服务所有请求 PHP 文件 .htaccess
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^?]*)$ /index.php [NC,L,QSA]
WordPress .htaccess 对于永久链接 .htaccess
(这是本节中唯一包含 RewriteEngine 规则的规则。)
# BEGIN WordPress
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
# END WordPress
强制使用 www .htaccess
RewriteEngine on
RewriteCond %{HTTP_HOST} ^example\.com [NC]
RewriteRule ^(.*)$ https://www.example.com/$1 [L,R=301,NC]
以通用方式强制使用 www .htaccess
RewriteCond %{HTTP_HOST} !^$
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteCond %{HTTPS}s ^on(s)|
RewriteRule ^ http%1://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
强制使用非 www .htaccess
RewriteEngine on
RewriteCond %{HTTP_HOST} ^www\.example\.com [NC]
RewriteRule ^(.*)$ https://example.com/$1 [L,R=301]
以通用方式强制使用非 www .htaccess
RewriteEngine on
RewriteCond %{HTTP_HOST} ^www\.
RewriteCond %{HTTPS}s ^on(s)|off
RewriteCond http%1://%{HTTP_HOST} ^(https?://)(www\.)?(.+)$
RewriteRule ^ %1%3%{REQUEST_URI} [R=301,L]
力 HTTPS - .htaccess
使用此重定向非 HTTPS 请求一个 HTTPS 请求。例如,如果您访问 https://example.com/,它将重定向到 https://example.com。
RewriteEngine on
RewriteCond %{HTTPS} !on
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
力 HTTPS 在代理后面 .htaccess
如果您的服务器前面有一个执行 TLS 终止的代理,则很有用。
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
强制使用尾部斜杠 .htaccess
使用关注 .htaccess 规则将任何不以斜杠结尾的请求重定向到相同的 URL(但末尾带有斜杠)。例如,从 https://example.com/your-page 重定向到 https://example.com/your-page/
RewriteCond %{REQUEST_URI} /+[^\.]+$
RewriteRule ^(.+[^/])$ %{REQUEST_URI}/ [R=301,L]
删除尾部斜杠 .htaccess
使用它来删除任何尾随斜杠(它将 301 重定向到非尾随斜杠 URL)
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ /$1 [R=301,L]
重定向单个页面 .htaccess
将单个 URL 重定向到新位置
Redirect 301 /oldpage.html https://www.yoursite.com/newpage.html
Redirect 301 /oldpage2.html https://www.yoursite.com/folder/
使用以下方式为单个目录设置别名 .htaccess
RewriteEngine On
RewriteRule ^source-directory/(.*) target-directory/$1
脚本的别名路径 .htaccess
RewriteEngine On
RewriteRule ^$ index.fcgi/ [QSA,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.fcgi/$1 [QSA,L]
这个例子有一个 index.fcgi 某个目录中的文件,并且该目录中任何无法解析文件名/目录的请求都将被发送到 index.fcgi 脚本。如果你想 baz.foo/some/cool/path 由...处理 baz.foo/index.fcgi (还支持以下请求 baz.foo)同时保持 baz.foo/css/style.css 等等。
使用以下方式重定向整个网站 .htaccess
使用以下内容 .htaccess 将整个站点重定向到新位置/域的规则
Redirect 301 / https://newsite.com/
这种方式可以保证链接完整。也就是说 www.oldsite.com/some/crazy/link.html 会变成 www.newsite.com/some/crazy/link.html。当您只是将网站“移动”到新域名时,这非常有用。
使用以下方式为“干净” URL 命名 .htaccess
此代码片段可让您使用“干净的 URL” - 那些没有 PHP 扩展,例如 example.com/users 而不是 example.com/users.php.
RewriteEngine On
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteRule ^([^.]+)$ $1.php [NC,L]
安全规则
拒绝所有访问 .htaccess
如果您想阻止 apache 提供任何文件,请使用以下命令。
这将阻止您访问您的网站。如果您想拒绝所有访问,但仍能自行查看,请阅读下一条规则:
Deny from all
拒绝除您之外的所有访问(仅允许某些 IP) .htaccess
使用此功能仅允许某些 IP 地址访问您的网站。
# Require all denied
# Require ip xxx.xxx.xxx.xxx
xxx.xxx.xxx.xxx 是您的 IP 地址。例如,如果您将最后三位数字替换为 0/12,这将指定同一网络内的 IP 地址范围,从而省去了单独列出所有允许 IP 地址的麻烦。
请参阅下一条规则以了解此规则的“反面”!
使用以下方式阻止 IP 地址 .htaccess
这将允许除列出的 IP 地址之外的所有 IP 进行访问。您可以使用此功能允许除垃圾邮件发送者 IP 地址之外的所有 IP 进行访问。
将 xxx.xxx.xxx.xxx 和 xxx.xxx.xxx.xxy 替换为您要阻止的 IP 地址。
Apache 2.4
# Require all granted
# Require not ip xxx.xxx.xxx.xxx
# Require not ip xxx.xxx.xxx.xxy
仅允许从 LAN 进行访问 .htaccess
order deny,allow
deny from all
allow from 192.168.0.0/24
拒绝访问某些用户代理(机器人) .htaccess
使用此 .htaccess 阻止/禁止某些用户代理的规则
RewriteCond %{HTTP_USER_AGENT} ^User\ Agent\ 1 [OR]
RewriteCond %{HTTP_USER_AGENT} ^Another\ Bot\ You\ Want\ To\ Block [OR]
RewriteCond %{HTTP_USER_AGENT} ^Another\ UA
RewriteRule ^.* - [F,L]
拒绝访问隐藏文件和目录 .htaccess
隐藏文件和目录(名称以点开头的文件和目录) .) 在大多数情况下(即使不是全部时间)都应该得到保护。例如: .htaccess、.htpasswd、.git、.hg。
RewriteCond %{SCRIPT_FILENAME} -d [OR]
RewriteCond %{SCRIPT_FILENAME} -f
RewriteRule "(^|/)\." - [F]
或者,你也可以提出 Not Found 错误,攻击者毫无头绪:
RedirectMatch 404 /\..*$
拒绝访问某些文件 .htaccess
使用它来阻止或拒绝访问某些文件
order allow,deny
deny from all
拒绝访问备份和源文件 .htaccess
这些文件可能是由一些文本/html 编辑器(如 Vi/Vim)留下的,当任何人都可以访问它们时,会带来巨大的安全隐患。
## Apache 2.2
Order allow,deny
Deny from all
Satisfy All
## Apache 2.4
# Require all denied
禁用目录浏览 .htaccess
Options All -Indexes
启用目录列表 .htaccess
Options All +Indexes
禁用某些文件类型的列表 .htaccess
使用此选项可以排除某些文件类型 Apache 目录列表。您可以使用此功能来阻止显示 .pdf 文件或视频文件。
IndexIgnore *.zip *.mp4 *.pdf
禁用图像热链接 .htaccess
RewriteEngine on
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?yourdomain.com [NC]
RewriteRule \.(jpg|jpeg|png|gif)$ - [NC,F,L]
重定向热链接器并显示不同的图像 .htaccess
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^https://(www\.)?your-website.com/.*$ [NC]
RewriteRule \.(gif|jpg|png)$ https://www.your-website.com/do-not-hotlink-our-content.jpg [R,L]
拒绝来自某些推荐人的访问 .htaccess
使用此规则可以阻止对包含来自特定域的引荐来源的请求的访问。
RewriteCond %{HTTP_REFERER} block-this-referer\.com [NC,OR]
RewriteCond %{HTTP_REFERER} and-block-traffic-that-this-site-sends\.com [NC]
RewriteRule .* - [F]
使用密码保护目录 .htaccess
首先,你需要在系统中的某个位置创建一个 .htpasswd 文件。在命令行中运行以下命令:
htpasswd -c /home/hidden/directory/here/.htpasswd the_username
然后您就可以使用它进行身份验证。在您的 .htaccess 您需要类似以下代码的文件,但请确保 AuthUserFile 是您刚刚创建的 .htpasswd 文件的文件路径。您应该将 .htpasswd 文件保存在无法通过 Web 访问的目录中。因此,请勿将其放在 /public_html/ 或 /www/ 目录中。
AuthType Basic
AuthName "Password Protected Dir Title"
AuthUserFile /home/hidden/directory/here/.htpasswd
Require valid-user
使用密码保护一个或多个文件 .htaccess
AuthName "Password Protected Directory Title"
AuthType Basic
AuthUserFile /home/hidden/directory/here/.htpasswd
Require valid-user
Require valid-user
绩效规则
使用以下方法压缩文本文件 .htaccess
# Force compression for mangled headers.
# https://developer.yahoo.com/blogs/ydn/posts/2010/12/pushing-beyond-gzipping
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
# Compress all output labeled with one of the following MIME-types
# (for Apache versions below 2.3.7, you don't need to enable `mod_filter`
# and can remove the `
# as `AddOutputFilterByType` is still in the core directives).
AddOutputFilterByType DEFLATE application/atom+xml \
application/javascript \
application/json \
application/rss+xml \
application/vnd.ms-fontobject \
application/x-font-ttf \
application/x-web-app-manifest+json \
application/xhtml+xml \
application/xml \
font/opentype \
image/svg+xml \
image/x-icon \
text/css \
text/html \
text/plain \
text/x-component \
text/xml
设置过期标头 .htaccess
过期标头 告诉浏览器是否应该从服务器请求特定文件,还是直接从缓存中获取。建议将静态内容的过期时间标头设置为将来某个时间。
如果您不使用基于文件名的缓存破坏来控制版本控制,请考虑将 CSS 和 JS 等资源的缓存时间降低到 1 周左右。
ExpiresActive on
ExpiresDefault "access plus 1 month"
# CSS
ExpiresByType text/css "access plus 1 year"
# Data interchange
ExpiresByType application/json "access plus 0 seconds"
ExpiresByType application/xml "access plus 0 seconds"
ExpiresByType text/xml "access plus 0 seconds"
# Favicon (cannot be renamed!)
ExpiresByType image/x-icon "access plus 1 week"
# HTML components (HTCs)
ExpiresByType text/x-component "access plus 1 month"
# HTML
ExpiresByType text/html "access plus 0 seconds"
# JavaScript
ExpiresByType application/javascript "access plus 1 year"
# Manifest files
ExpiresByType application/x-web-app-manifest+json "access plus 0 seconds"
ExpiresByType text/cache-manifest "access plus 0 seconds"
# Media
ExpiresByType audio/ogg "access plus 1 month"
ExpiresByType image/gif "access plus 1 month"
ExpiresByType image/jpeg "access plus 1 month"
ExpiresByType image/png "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"
# Web feeds
ExpiresByType application/atom+xml "access plus 1 hour"
ExpiresByType application/rss+xml "access plus 1 hour"
# Web fonts
ExpiresByType application/font-woff2 "access plus 1 month"
ExpiresByType application/font-woff "access plus 1 month"
ExpiresByType application/vnd.ms-fontobject "access plus 1 month"
ExpiresByType application/x-font-ttf "access plus 1 month"
ExpiresByType font/opentype "access plus 1 month"
ExpiresByType image/svg+xml "access plus 1 month"
使用以下方式关闭电子标签 .htaccess
通过删除 ETag 标头,您可以禁用缓存和浏览器验证文件的能力,因此它们被迫依赖您的 Cache-Control 和 Expires 标头。
Header unset ETag
FileETag None
限制上传文件大小 .htaccess
将文件大小以字节为单位。下面的代码将其限制为 1mb。
LimitRequestBody 1048576
其他规则
mod_rewrite 的服务器变量 .htaccess
%{API_VERSION}
%{DOCUMENT_ROOT}
%{HTTP_ACCEPT}
%{HTTP_COOKIE}
%{HTTP_FORWARDED}
%{HTTP_HOST}
%{HTTP_PROXY_CONNECTION}
%{HTTP_REFERER}
%{HTTP_USER_AGENT}
%{HTTPS}
%{IS_SUBREQ}
%{REQUEST_FILENAME}
%{REQUEST_URI}
%{SERVER_ADDR}
%{SERVER_ADMIN}
%{SERVER_NAME}
%{SERVER_PORT}
%{SERVER_PROTOCOL}
%{SERVER_SOFTWARE}
%{THE_REQUEST}
选择 PHP 变量 .htaccess
php_value
例如:
php_value upload_max_filesize 50M
php_value max_execution_time 240
自定义错误页面 .htaccess
ErrorDocument 500 "Houston, we have a problem."
ErrorDocument 401 https://error.yourdomain.com/mordor.html
ErrorDocument 404 /errors/halflife3.html
更新时将用户重定向到维护页面 .htaccess
这会将用户重定向到维护页面,但允许访问您的 IP 地址。请将 555.555.555.555 更改为您的 IP 地址,并将 YourMaintenancePageFilenameOrFullUrlUrl.html 更改为您的错误页面(或使用其他域名的完整 URL)。
ErrorDocument 403 YourMaintenancePageFilenameOrFullUrlUrl.html
Order deny,allow
Deny from all
Allow from 555.555.555.555
强制下载 .htaccess
有时你想强制浏览器下载某些内容而不是直接显示它们。以下代码片段可以帮助你实现这一点。
ForceType application/octet-stream
Header set Content-Disposition attachment
禁用显示服务器信息(服务器签名) .htaccess
虽然许多人认为这毫无意义(特别是在安全方面),但如果您想阻止服务器泄露服务器信息(服务器操作系统等),请使用以下命令:
ServerSignature Off
防止下载 .htaccess
有时你想强制浏览器显示某些内容而不是下载它们。以下代码片段可以帮助你实现这一点。
Header set Content-Type text/plain
允许跨域字体 .htaccess
CDN由于 CROS 问题,-served webfonts 可能无法在 Firefox 或 IE 中使用。以下来自 alrra 的代码片段应该可以解决这个问题。
Header set Access-Control-Allow-Origin "*"
自动 UTF-8 编码 .htaccess
有 Apache 自动以 UTF-8 编码您的内容,请使用以下代码。如有需要,您还可以将 UTF-8 替换为其他字符集:
# Use UTF-8 encoding for anything served text/plain or text/html
AddDefaultCharset utf-8
# Force UTF-8 for a number of file formats
AddCharset utf-8 .atom .css .js .json .rss .vtt .xml
使用以下方式设置服务器时区(UTC 或其他时区) .htaccess
SetEnv TZ UTC
查看时区列表。要将其设置为洛杉矶时区:
SetEnv TZ America/Los_Angeles
切换到另一个 PHP 版本有 .htaccess
如果你在共享主机上,那么可能会有多个版本的 PHP 已安装,有时您需要为您的网站指定特定版本。例如,需要 PHP >= 5.4. 以下代码片段应该切换 PHP 版本给你。
AddHandler application/x-httpd-php55 .php
或者,您可以使用 AddType
AddType application/x-httpd-php55 .php
禁用 Internet Explorer 兼容性视图
IE 中的兼容性视图可能会影响某些网站的显示方式。以下代码片段应强制 IE 使用 Edge Rendering Engine 并禁用兼容性视图。
BrowserMatch MSIE is-msie
Header set X-UA-Compatible IE=edge env=is-msie
执行 PHP 使用不同的文件扩展名 .htaccess
以下代码将使用 php 运行以 .ext 结尾的文件:
AddType application/x-httpd-php .ext
如果存在,则自动提供 WebP 图像
如果支持 WebP 图像,并且在与要提供的 jpg/png 图像相同的位置找到具有 .webp 扩展名且名称相同的图像,则提供 WebP 图像。
RewriteEngine On
RewriteCond %{HTTP_ACCEPT} image/webp
RewriteCond %{DOCUMENT_ROOT}/$1.webp -f
RewriteRule (.+)\.(jpe?g|png)$ $1.webp [T=image/webp,E=accept:1]
刚买了主机?接下来该怎么做?
设置主机可能会让人困惑。因此,我们创建了 HostScore 设置帮助,这是一项为您完成的服务,可帮助您以正确的方式配置您的主机。
我们帮助 SSL 安装、DNS 和名称服务器设置, WordPress 安装或迁移,以及安全调优。一次性付费。100%退款保证。
探索我们的服务
总结
这个 .htaccess 文件是一个强大的工具,但重要的是要明智地使用它。虽然添加额外的规则来快速修复可能很诱人,但请记住 .htaccess 不是主配置文件。
每次服务器遇到 .htaccess 文件,它必须读取并执行该文件,从而覆盖主配置设置。此过程会消耗资源,并可能降低网站速度,尤其是在过度使用的情况下。尽可能直接在服务器级别应用配置(例如,在 Apache的主配置文件)以获得更好的性能。
通过使用 .htaccess 高效地搭配 优化的托管计划 – 您可以增强网站的安全性、性能和可扩展性
常见问题解答
我应该使用 .htaccess?
从全球使用意义上来说 .htaccess 文件可以提供很多便利。然而,这可能会增加服务器资源的成本。尽可能依赖主服务器配置,而不是 .htaccess 文件中。
我怎么知道我的 .htaccess 在工作吗?
确保你的 .htaccess 文件是否正常工作的方法是访问放置它的目录的 URL。如果它不工作,您可能会遇到 500 内部服务器错误。
我可以有多个 .htaccess 文件?
.htaccess 从技术上讲,文件可以放置在您想要配置的每个目录中。如果您运行多个网站,则每个主目录都可以有自己的文件,并且其下的每个子目录中都可以有一个文件。
htaccess 中的重写规则是什么?
重写 Apache 允许您重写 URL 请求的模块。它只是接收传入的请求,并将其定向到您指定的替代请求。