在很多自定义 Web 服务器的工具中,.htaccess配置文件是一个非常实用的工具。你可以快速重置文档类型、解析引擎、URL 重定向以具体用法。在本文中,我想为网站管理员和 Web 开发人员提供一些更有目的性的概念。.htaccess 提供了非常多的可定制性,它可以在从 php 到 Ruby 的任何 Web 语言中使用。任何在Apache 服务器上搭建自己网站的人肯定想了解如何管理他们的.htaccess 文件。
为什么要使用.htaccess 文件?
这是一个很好的问题,也许我们应该首先回答“什么是.htaccess 文件”?它是 Apache Web 服务器使用的一个非常特殊的配置文件。.htaccess 文件可以告诉 Web 服务器如何呈现各种形式的信息以及如何处理各种 HTTP 请求标头。
真的,这是一种分散 Web 服务器设置的方法。一个物理服务器可以拥有 50 个不同的网站,每个网站都有自己的.htaccess 文件。它为网站管理员提供了很多权力,否则这是不可能的。但是你为什么要用一个呢?
最大的原因是安全。您可以锁定某些目录或使其受密码保护。这非常适合私人项目或新的内容管理系统,您需要一些额外的安全性。但是也有一些常见的任务,例如将 404 错误消息重定向到某个网页。这只需要一行代码,它可以极大地影响访问者对 404 页面的反应。
说实话,我没有太多理由去说服别人.htaccess 文件值得去理解和应用。一旦你看到它在行动,你就可以知道来自这个微小的配置文件的所有价值。此外,我希望本文的其余部分可以提供一些有见地的话题,让网站管理员了解如何管理.htaccess 配置。
允许/拒绝访问
可以识别潜在的垃圾访问者并拒绝他们访问您的网站。这可能有点极端,但是如果你知道一个人或一群人一直在瞄准你的网站,你可以通过IP 地址选择域引用来拒绝或禁止访问者。
order allow,deny
deny from 255.0.0.0
deny from 123.45.6.
allow from all
这些示例代码是从Htaccess 指南中复制的,因为它们是入门的完美模板。请注意,第二个 IP 地址缺少第 4 个整数。此代码块将以第一个 IP(255.0.0.0)和 123.45.6.0-255 范围内的每个 IP 为目标,然后允许所有其他流量。网站管理员可能不会像其他技术那样经常使用它,但它有助于理解。
阻止目录列表
有时你有一个打开的目录,默认情况下设置为允许浏览。这意味着用户可以查看内部目录结构中列出的所有文件,例如 images 文件夹。一些网站管理员不希望允许目录列表,下面的代码片段就可以实现。
Options -Indexes
我已经看到这个答案在Stack Overflow中出现了数次,它可能是最容易记住的.htaccess 规则之一。
实际上可以在每个目录中创建多个.htaccess 文件,因此可能其中一个受密码保护,但其他文件不受密码保护。你仍然可以保留 Options -Indexes,以便访问者无法浏览你的网站/图像/文件夹。
密码保护目录
密码保护目录是保护管理区域和对您的网站至关重要的其他文件夹的一种非常常见的过程。你可以用来设置极少数人可以访问这些目录,或者用来防止黑客访问你的网站管理面板。但无论哪种用途,它都是解决许多问题的非常强大的解决方案。
这里有一篇密码保护指南,介绍了重要的代码片段。你需要生成一个存储用户名/密码凭据的密码文件。以便 Apache 检查用户输入的内容,看看是否应该授予他们访问权限。请注意查看如何生成用户名和密码的示例。
我建议使用这个htpassword 生成器,可以节省一些时间。它的语法总是很完美,你不需要自己加密密码。另一个很好的选择是密码保护整个目录列表:
AuthType Basic
AuthName "This Area is Password Protected"
AuthUserFile /full/path/to/.htpasswd
Require valid-user
WordPress 安全
为了充分利用这个密码保护的想法,让我们展示一个真实的例子。这个更复杂的代码片段将强制用户身份验证访问 WordPress wp-login.php 文件的任何人。你可以在Ask Apache上找到原始源代码,其中包含许多其他的 WordPress 保护代码。
<Files wp-login.php>
Order Deny,Allow
Deny from All
Satisfy Any
AuthName "Protected By AskApache"
AuthUserFile /web/askapache.com/.htpasswda1
AuthType Basic
Require valid-user
</Files>
如果你要遵循这些.htaccess 规则,它也可能有助于密码保护管理区域。通常,wp-login.php 是攻击者最频繁访问的文件。所以,上面的示例代码也足以为你的 WordPress 网站增加安全性。
推荐阅读《增强 WordPress 安全性的 15 个.htaccess 代码片段》
HTTP URL 重写规则
重写 URL 可能是.htaccess 文件最常用的一种功能。WordPress 默认安装实际上可以直接从管理面板生成.htaccess 文件。这样你就可以设置非 .php?p=1 结构的漂亮链接。
让我们看一下如何将下划线更改为破折号的重写示例,因为它包含许多最重要的元素。
Options +FollowSymLinks
RewriteEngine On
RewriteBase /
RewriteRule !.(html|php)$ - [S=4]
RewriteRule ^([^_]*)_([^_]*)_([^_]*)_([^_]*)_(.*)$ $1-$2-$3-$4-$5 [E=uscor:Yes]
RewriteRule ^([^_]*)_([^_]*)_([^_]*)_(.*)$ $1-$2-$3-$4 [E=uscor:Yes]
RewriteRule ^([^_]*)_([^_]*)_(.*)$ $1-$2-$3 [E=uscor:Yes]
RewriteRule ^([^_]*)_(.*)$ $1-$2 [E=uscor:Yes]
RewriteCond %{ENV:uscor} ^Yes$
RewriteRule (.*) http://d.com/$1 [R=301,L]
RewriteEngine 和 RewriteBase 通常都是默认这样设置。你需要开启 RewriteEngine,才能正常工作。网上有很多指南解释如何启用 mod_rewrite,您的托管服务提供商也可以提供帮助。
请注意,语法遵循顶部的 RewriteRules 模式。这些规则用于匹配作为 HTTP 请求重写的情况。RewriteRule 会在符合情况的时候,将所有内容重定向到域名 d.com。而 [R=301,L] 这样的结束括号称为重写标志,这些标志很重要,要讨论这个就非常复杂了,在此不展开了。
mod_rewrite 语法肯定有点令人困惑,但不要被吓倒!在其他示例中,片段看起来容易得多。
刚开始时,我推荐使用这个mod_rewrite 生成器,它可以帮助你使用真实的 URL 来生成代码示例。这是一个很棒的工具,因为你可以在语法中查找各种项目,以查看它们在重写规则中的实际操作。
RewriteRule ^dir/([0-9]+)/?$ /index.php?id=$1 [L]
不要试图一次性就能掌握这些规则。我花了 3-4 个多月才真正开始了解如何使用 [0-9a-zA-Z]+ 和类似模式重写 URL。继续练习,我保证你会有所收获的!
网站管理员的代码片段
我喜欢易于使用的片段,我想为网站管理员整理这些相关的.htaccess 代码。这些想法中的每一个都可以很好地应用在你自己的.htaccess 文件以及其他代码块。这些代码片段中的大多数都非常适合解决 Web 服务器环境中的某些问题。
设置 DirectoryIndex
DirectoryIndex 命令通常用在第一行。用来告诉 Apache 哪些文档最初应被视为“主”文档。默认情况下,应该使用诸如 index.html、index.php、index.asp 和其他索引文件之类的项目。通过使用我在下面复制的代码片段,你可以将此根文档制作成你喜欢的任何内容。
DirectoryIndex index.html index.cgi index.php
文件的顺序应该按照重要性从高到低进行排列。如果不存在 HTML 或 CGI 文件,那么将回退到 index.php。你甚至可以将这些文件命名为 home.php 或 someotherfile.php,它们都是有效的语法。
强制 WWW 或非 WWW 子域
如果你未指定 www.domain.com 或仅指定 domain.com, google 可以使用你网站域的两个版本。根据我的经验,最好选择其中一种,并通过.htaccess 将其设置为唯一的选择。然后谷歌才会只收录一个域名下的内容,不会导致两个版本的情况出现。
# 强制到 www 子域名
RewriteEngine On
RewriteCond %{HTTP_HOST} ^domain.com [NC]
RewriteRule ^(.*)$ http://www.domain.com/$1 [L,R=301]
# 强制到根域名
RewriteEngine On
RewriteCond %{HTTP_HOST} !^domain.com$ [NC]
RewriteRule ^(.*)$ http://domain.com/$1 [L,R=301]
此代码段来自css-Tricks,提供了非常方便的解决方案。你应该将域名更改为自己网站的,否则会有问题!但我非常支持强制执行这两个选项中的一个,并且在启动新网站后就需要设置好。
强制下载媒体文件
另一个相当重要的片段允许强制下载某些媒体类型而不是在浏览器中显示。我们都知道 PDF 文档和 MP3 音频文件应该是可以被下载的,但是如何确保它们可以下载?我在Htaccess 指南上发现了一篇类似的文章,其中概述了这段代码。
AddType Application/octet-stream .zip .mp3 .mp4
你可以在此行的末尾添加更多文件类型。使用八位字节流 MIME 类型的所有媒体格式都是可下载的。通过.htaccess 强制执行此操作是确保人们无法在浏览器中查看这些文件的直接路径。
自定义错误文档
我要添加的最后一篇文章是自定义错误文档的完整模板。通常这些数字代码只能在服务器端看到。但是有很多这些错误文档你应该熟悉。比如 403/404 错误和 301 重定向。
此错误代码模板从 100 开始,一直到 500 错误。请注意,你不需要完全去用完这些,只需要去设置一些你认为比较常用的即可。
如果你不认识代码,可以在维基百科上查找以获得更好的理解。
ErrorDocument 100 /100_CONTINUE
ErrorDocument 101 /101_SWITCHING_PROTOCOLS
ErrorDocument 102 /102_PROCESSING
ErrorDocument 200 /200_OK
ErrorDocument 201 /201_CREATED
ErrorDocument 202 /202_ACCEPTED
ErrorDocument 203 /203_NON_AUTHORITATIVE
ErrorDocument 204 /204_NO_CONTENT
ErrorDocument 205 /205_RESET_CONTENT
ErrorDocument 206 /206_PARTIAL_CONTENT
ErrorDocument 207 /207_MULTI_STATUS
ErrorDocument 300 /300_MULTIPLE_CHOICES
ErrorDocument 301 /301_MOVED_PERMANENTLY
ErrorDocument 302 /302_MOVED_TEMPORARILY
ErrorDocument 303 /303_SEE_OTHER
ErrorDocument 304 /304_NOT_MODIFIED
ErrorDocument 305 /305_USE_PROXY
ErrorDocument 307 /307_TEMPORARY_REDIRECT
ErrorDocument 400 /400_BAD_REQUEST
ErrorDocument 401 /401_UNAUTHORIZED
ErrorDocument 402 /402_PAYMENT_REQUIRED
ErrorDocument 403 /403_FORBIDDEN
ErrorDocument 404 /404_NOT_FOUND
ErrorDocument 405 /405_METHOD_NOT_ALLOWED
ErrorDocument 406 /406_NOT_ACCEPTABLE
ErrorDocument 407 /407_PROXY_AUTHENTICATION_REQUIRED
ErrorDocument 408 /408_REQUEST_TIME_OUT
ErrorDocument 409 /409_CONFLICT
ErrorDocument 410 /410_GONE
ErrorDocument 411 /411_LENGTH_REQUIRED
ErrorDocument 412 /412_PRECONDITION_FAILED
ErrorDocument 413 /413_REQUEST_ENTITY_TOO_LARGE
ErrorDocument 414 /414_REQUEST_URI_TOO_LARGE
ErrorDocument 415 /415_UNSUPPORTED_MEDIA_TYPE
ErrorDocument 416 /416_RANGE_NOT_SATISFIABLE
ErrorDocument 417 /417_EXPECTATION_FAILED
ErrorDocument 422 /422_UNPROCESSABLE_ENTITY
ErrorDocument 423 /423_LOCKED
ErrorDocument 424 /424_FAILED_DEPENDENCY
ErrorDocument 426 /426_UPGRADE_REQUIRED
ErrorDocument 500 /500_INTERNAL_SERVER_ERROR
ErrorDocument 501 /501_NOT_IMPLEMENTED
ErrorDocument 502 /502_BAD_GATEWAY
ErrorDocument 503 /503_SERVICE_UNAVAILABLE
ErrorDocument 504 /504_GATEWAY_TIME_OUT
ErrorDocument 505 /505_VERSION_NOT_SUPPORTED
ErrorDocument 506 /506_VARIANT_ALSO_VARIES
ErrorDocument 507 /507_INSUFFICIENT_STORAGE
ErrorDocument 510 /510_NOT_EXTENDED