入门指南 .htaccess:完整的备忘单、示例和最佳实践

免责声明:HostScore由读者支持运营。当您通过我们的链接进行购买时,我们可能会获得佣金。本网站所有价格均以美元 (USD) 显示,除非另有说明。

目录

向 AI 諮詢本頁內容::
ChatGPT
克劳德
Perplexity
Grok
Google AI

.htaccess 是一个简单的文本文件,用于控制 Web 服务器处理请求的方式。它最初设计用于管理目录访问权限,但现在它有许多其他用途。

本指南并未深入探讨 .htaccess 而是一个实用的介绍,其中包含一些有用的代码片段。虽然 .htaccess 虽然它功能强大,但这并不意味着你应该把它用在所有事情上。了解何时以及如何应用它可以提升你网站的安全性、性能和功能。

什么是 .htaccess?

.htaccess 文件是“超文本访问”的缩写,是主要用于 Apache 服务器。它允许用户控制访问权限、密码保护目录、设置重定向、自定义错误页面以及阻止特定的 IP 地址。

与 .htpasswd 文件配合使用,可以实现对多个用户的精细目录访问控制。许多托管服务提供商支持 .htaccess,但它并不通用——一些 Web 服务器(如 Nginx)使用不同的方法。

在哪里可以找到你的 .htaccess 文件?

默认情况下, .htaccess 文件在 cPanel 的文件管理器和其他主机控制面板中是隐藏的。您可以在文件管理器设置中启用“显示隐藏文件”选项来显示它。

如果您找不到该文件,请不要慌张——它可能还不存在。大多数情况下,它应该位于您网站的根目录中,通常名为 public_html 或 www。如果您在同一个托管账户下管理多个网站,则每个网站可能都有自己的 .htaccess 文件位于其各自的文件夹中。

大多数以句点 (.) 开头的系统文件都是隐藏的。如果您的 .htaccess 文件不可见,请检查您的托管设置或在文本编辑器中手动创建一个。

您的 .htaccess cPanel 文件管理器默认隐藏该文件。您可以通过配置文件管理器设置来显示它。
您的 .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
<IfModule mod_rewrite.c>
 RewriteEngine On
 RewriteBase /
 RewriteCond %{REQUEST_FILENAME} !-f
 RewriteCond %{REQUEST_FILENAME} !-d
 RewriteRule . /index.php [L]
</IfModule>
# 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

使用它来阻止或拒绝访问某些文件

<files your-file-name.txt>
order allow,deny
deny from all
</files>
拒绝访问备份和源文件 .htaccess

这些文件可能是由一些文本/html 编辑器(如 Vi/Vim)留下的,当任何人都可以访问它们时,会带来巨大的安全隐患。

<FilesMatch "(\.(bak|config|dist|fla|inc|ini|log|psd|sh|sql|swp)|~)$">
    ## Apache 2.2
    Order allow,deny
    Deny from all
    Satisfy All

    ## Apache 2.4
    # Require all denied
</FilesMatch>
禁用目录浏览 .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

<Files "/a-private-file.txt">
Require valid-user
</Files>

<FilesMatch ^((one|two|three)-rings?\.o)$>
Require valid-user
</FilesMatch>

绩效规则

使用以下方法压缩文本文件 .htaccess
<IfModule mod_deflate.c>

        # Force compression for mangled headers.
        # https://developer.yahoo.com/blogs/ydn/posts/2010/12/pushing-beyond-gzipping
        <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>

        # 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 `<IfModule mod_filter.c>` and `</IfModule>` lines
        #    as `AddOutputFilterByType` is still in the core directives).
        <IfModule mod_filter.c>
            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
        </IfModule>

</IfModule>
设置过期标头 .htaccess

过期标头 告诉浏览器是否应该从服务器请求特定文件,还是直接从缓存中获取。建议将静态内容的过期时间标头设置为将来某个时间。

如果您不使用基于文件名的缓存破坏来控制版本控制,请考虑将 CSS 和 JS 等资源的缓存时间降低到 1 周左右。

<IfModule mod_expires.c>
        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"
</IfModule>
使用以下方式关闭电子标签 .htaccess

通过删除 ETag 标头,您可以禁用缓存和浏览器验证文件的能力,因此它们被迫依赖您的 Cache-Control 和 Expires 标头。

<IfModule mod_headers.c>
        Header unset ETag
</IfModule>
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 <key> <val>
例如:
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

有时你想强制浏览器下载某些内容而不是直接显示它们。以下代码片段可以帮助你实现这一点。

<Files *.md>
        ForceType application/octet-stream
        Header set Content-Disposition attachment
</Files>
禁用显示服务器信息(服务器签名) .htaccess

虽然许多人认为这毫无意义(特别是在安全方面),但如果您想阻止服务器泄露服务器信息(服务器操作系统等),请使用以下命令:

ServerSignature Off
防止下载 .htaccess

有时你想强制浏览器显示某些内容而不是下载它们。以下代码片段可以帮助你实现这一点。

<FilesMatch "\.(tex|log|aux)$">
        Header set Content-Type text/plain
</FilesMatch>
允许跨域字体 .htaccess

CDN由于 CROS 问题,-served webfonts 可能无法在 Firefox 或 IE 中使用。以下来自 alrra 的代码片段应该可以解决这个问题。

<IfModule mod_headers.c>
        <FilesMatch "\.(eot|otf|ttc|ttf|woff|woff2)$">
                Header set Access-Control-Allow-Origin "*"
        </FilesMatch>
</IfModule>
自动 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 并禁用兼容性视图。

<IfModule mod_headers.c>
    BrowserMatch MSIE is-msie
    Header set X-UA-Compatible IE=edge env=is-msie
</IfModule>
演练: 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 请求的模块。它只是接收传入的请求,并将其定向到您指定的替代请求。

关于作者: Timothy Shim

Timothy Shim 是一位作家、编辑和技术爱好者。他的职业生涯始于信息技术领域,之后他迅速进入印刷领域,并与国际、地区和国内媒体合作,包括 ComputerWorld、PC.com、《今日商业》和《亚洲银行家》。他的专长在于从消费者和企业的角度研究技术领域。
作者照片

更多HostScore内容

找到合适的网站主机

不确定哪种主机方案适合您的网站?网站主机查找器会根据您网站的实际需求(工作负载、使用情况和优先级)匹配真正合适的主机选项。

建自 HostScore凭借其真实的托管经验和性能研究,它可以帮助您避免支付过高的费用、资源配置不足或选择无法扩展的方案。

试试网站托管查找器(免费)