适用于小型个人网站的快速简易 .htaccess .htaccess 是什么?.htaccess(以及共享主机)的局限性和缺点 常见用例速查表 调试和其他一般技巧 其他资源

2025-06-07

适用于小型个人网站的快速而简单的 .htaccess

什么是.htaccess

.htaccess(和共享主机)的局限性和缺点

常见用例备忘单

调试和其他一般技巧

其他资源

我在 Dreamhost 的共享实例上托管我的个人网站。我喜欢它,因为它相对便宜,流量不大,而且我不需要做任何特别复杂的工作。通过虚拟专用服务器 (VPS) 或专用服务器托管来获得完全的 root 权限,对于我目前的工作来说不太合理。但是,我仍然希望对我网站上可用的内容和访问方式拥有一定的服务器级别控制权。这就是 Dreamhost 的意义.htaccess所在。

更新:从 2019 年初开始,我的个人网站使用的是 Digital Ocean 上的 nginx 设置,而不是 Dreamhost 上的 Apache 设置。到目前为止,我更喜欢 Digital Ocean 的体验,不管它值多少钱。:)

什么是.htaccess

许多主机托管服务商在后端使用 Apache HTTP 服务器来为您的网站提供服务。从最基本的层面来说,您的网站是存放在某台计算机上的文件集合。您希望其他计算机上的用户能够通过互联网访问这些文件。Web 服务器是接收请求、查找正确文件并将内容返回给客户端的软件。Apache.htaccess使用 Apache HTTP 服务器文件来让您更好地控制这些请求的处理方式。.htaccess该文件设置了其所在目录中所有文件请求的配置。

我为什么要关心?

您的网站无需文件即可运行,.htaccess无需微调服务器配置。但利用其功能可以实现一些外观上的改进,例如强制添加或删除URL,或者在链接到您网站上的页面时www无需文件扩展名。.html

它还可以提供安全优势。如果您使用 git 控制网站部署,可能会意外地将凭据或敏感信息暴露给开放的互联网。您还可以强制用户https在连接到您的网站时使用 git,这除了在安全方面是正确的做法外,还可以帮助提升您的 SEO 排名。

.htaccess(和共享主机)的局限性和缺点

有些人很快指出,使用.htaccessApache 的配置(而非主配置)会导致性能下降。当服务器负载较高时,这种性能下降会更加严重。一般来说,.htaccess如果您使用的是共享主机环境,那么您可能更倾向于使用 Apache 的配置。如果您只是想托管一个小型投资组合网站或一个玩具应用程序,那么深入研究云计算、获取 root 权限并成为自己的 Apache 系统管理员可能有些过度了。

如果您的服务器流量很大,并且/或者负载过高,您可能应该迁移到拥有 root 权限的 VPS 并使用主服务器配置。如果这对您来说是个问题,那么您可能已经发展到超出单人运营的规模,应该聘请专业人员来维护网站的可靠性。但如果您只是运行一个小型、基本静态的网站,则无需担心使用 会导致性能下降.htaccess

.htaccess与 中的主要 Apache 配置相比,其范围更有限httpd.conf。您将无法使用 执行目录级操作等操作.htaccess。如果您需要控制网站的目录级访问权限,那么更强大的托管选项是明智之举。但除非您在复杂的环境中工作,并且需要进行大量的网站可靠性微调,否则即使没有 root 权限也能正常工作。

常见用例备忘单

这里有一些你可能会用到的东西.htaccess。你可以直接从这里复制/粘贴,因为我之前也复制/粘贴过。

许多代码片段都需要你启用此RewriteEngine功能。每个文件只需启用一次,就可以将所有重写请求放在此按钮下。为了方便复制/粘贴,我将RewriteEngine On所有相关的代码片段都包含在内。请确保不要复制多次。

保护自己免遭带宽盗窃

带宽盗窃(又称热链接)是指将图片链接到他人网站并在自己的网站上显示的行为。这会占用您链接服务器的带宽,而不是您自己的带宽。这非常粗鲁!

但是,您可以保护您的网站,避免任何图片被热链接。

RewriteEngine On
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http(s)?://(.+\.)?mysite\.com [NC]
RewriteRule .*\.(jp(e)?g|gif|bmp|png)$ https://imgur.com/ZtXiCBw.gif [L,R]
Enter fullscreen mode Exit fullscreen mode

(请确保替换mysite\.com为您的实际网址)

上面的代码会检查请求的来源,也就是referer。如果 referer 不是你的网站(或者为空),它就会显示你重定向到的图片。

上述链接将重定向至 imgur 上的以下图片:

动画放射性符号和文字阅读

任何遇到过这种情况的人都会很快学会停止窃取你的带宽:)

SEO改进

将旧页面重定向到新位置

您可以做的最基本、最实用的事情之一.htaccess就是将之前位于某个位置的页面重定向到新的 URL。这对于 SEO 来说至关重要。如果您写了一篇热门博客文章,现在要将其迁移到其他地方,您肯定不希望仅仅因为内容位置发生变化而失去链接权益(即链接对搜索引擎的影响力)。

一般来说,您可能希望使用 301 或 302 重定向。301 是永久重定向。302 重定向是临时的,不会保留您的链接权益。但是,在尝试使用重定向时,您应该始终先使用 302 重定向并测试更改。如果一切正常,再将其更改为 301。这样做是为了避免意外地将链接权益从旧位置转发到错误的位置。

格式化重定向语句时,参数的顺序如下

  • 状态代码(301、302、404 等)
  • 旧文件位置
  • 新文件位置
Redirect 302 /2016/08/02/rad-old-blog-post/ https://newdomain.party/rad-old-blog-post/
Redirect 301 /menu/dessert.html https://new-restaurant-website.supply/menu/dessert/
Enter fullscreen mode Exit fullscreen mode

执行https

有些主机提供商允许您强制https用户何时连接到您的网站。有些则只是允许,https但并未严格执行。使用连接对于网站安全和 SEO都至关重要https因此如果您的主机提供商不强制连接,应该这样做。https

https您可以使用以下代码片段将所有不安全的请求重写为请求。

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
Enter fullscreen mode Exit fullscreen mode

外观改进

不需要.html

没有什么比.html在 URL 末尾挂个文件扩展名更俗气、更过时的了。我是说,我主要是开玩笑,但我真的不喜欢那个文件扩展名挂在 URL 后面。好在,你可以解决这个问题!

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.html -f
RewriteRule ^(.*)$ $1.html
Enter fullscreen mode Exit fullscreen mode

此条件检查您发出的请求是否针对项目中的有效目录。我们在这里检查目录而不是文件,因为请求类似于mysite.com/info,它看起来像目录名。如果找不到有效目录,它会检查是否存在名为 的有效文件info.html。如果存在,则重写请求以从 提供内容mysite.com/info.html

您可以使用相同的想法来删除其他文件扩展名,如.htm.php

强制执行(或强制删除)www

强制 www:

RewriteEngine On
RewriteCond %{HTTP_HOST} ^example\.com [NC]
RewriteRule ^(.*)$ http://www.example.com/$1 [L,R=301,NC]
Enter fullscreen mode Exit fullscreen mode

删除 www:

RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.example\.com [NC]
RewriteRule ^(.*)$ http://example.com/$1 [L,R=301]
Enter fullscreen mode Exit fullscreen mode

这里的 [NC] 标志代表 No Case,因此您不必担心区分大小写。

[L] 标志代表“最后”,意思是如果此条件为真,则执行RewriteRule并且不尝试匹配其他RewriteConds或对请求执行其他操作。

[R] 标志代表“重定向”。您可以向 R 传递一个选项来设置重定向的 HTTP 状态代码。例如 [R=302] 或 [R=404]。

安全改进

隐藏.git目录

版本控制功能非常强大,即使对于静态网站也是如此。它可以帮助您轻松恢复到之前的版本,并让您回顾代码的演变过程。但是,通过 git push/pull 控制网站更新可能会带来安全漏洞。访问者可以.git通过浏览器公开访问您的目录,并浏览您的整个代码库,包括您可能存储在那里的任何机密信息或密钥。如果您托管的是一个比静态个人网站更复杂的网站,那么即使您打算将其保密,任何人都可以查看您的源代码并复制您的工作。

幸运的是,您可以重定向任何请求.git目录的尝试。

RedirectMatch 404 /\.git
Enter fullscreen mode Exit fullscreen mode

很简单!您可以在这里返回任何您想要的状态。我个人喜欢使用 404,因为它看起来好像服务器上根本不存在这样的目录,并且可能会阻止进一步访问类似文件的尝试。不过,403 在这里也是合理的。这取决于您。

限制对敏感文件的访问

您可能不希望随机访问您网站的访客访问您的点文件或其他敏感信息。您可以禁止所有人访问特定文件,或者在 中允许/阻止某些 IP 地址.htaccess

注意:您无法使用限制或允许目录.htaccess级别的访问。这是需要进入httpd.conf并需要 root 权限的操作之一。

# Don't allow anyone to see my .htaccess file
<Files .htaccess>
  Order allow,deny
  Deny from all
</Files>
Enter fullscreen mode Exit fullscreen mode

这里的关键字Order有点棘手,我们来仔细研究一下。Order接受两个参数之一。 要么allow,deny要么deny,allow。确保逗号和参数中的第二个单词之间没有空格。如果在那里放了空格,所有发送到您网站的请求都会被限制为 500。这个参数告诉 Apache 应该按照什么顺序处理允许和拒绝语句。

allow,deny表示它将Allow先处理所有语句,Deny最后处理所有语句。最新的语句将覆盖它之前的所有语句。因此,在上面的示例中,如果您想允许并且只允许自己的 IP 地址通过 curl 或浏览器查看.htaccess,您可以包含类似 的语句Allow from 198.51.100.254。但是,由于您的配置指示服务器Allow先处理所有语句,然后再覆盖它们,因此您仍然会被拒绝访问,因为Deny from all这是最新的顺序。

相反,首先deny,allow处理所有Deny语句,然后用覆盖Allow。如果您要做比拒绝或允许所有人访问更复杂的事情,请务必注意您的Order论点,并确保对其进行测试。

您还可以使用此语法来限制对特定 HTTP 方法的访问。例如,如果您愿意,可以将操作限制POSTPUT局域网 (LAN) 内。

<Limit POST PUT>
  Order deny,allow
  Deny from all
  Allow from 198.51.100.254
</Limit>
Enter fullscreen mode Exit fullscreen mode

调试和其他一般技巧

确保您知道日志文件的位置。即使您没有 root 权限,也应该能够查看网站的访问日志和错误日志。错误日志对于调试您在设置配置时遇到的任何意外结果或错误非常有用。

坏标志分隔符

如果您的错误消息包含短语bad flag delimiter,则可能是您的标志中包含了多余的空格RewriteRule。标志是用逗号分隔的,而不是逗号 + 空格分隔的,因此请确保将标志的格式设置为 ,[L,R=301,NC]而不是像这样:[L, R=301, NC]

此处不允许执行某些操作

如果您的错误消息包含短语not allowed here,则您可能正在尝试执行一些需要在httpd.conf主配置文件中执行的操作。您需要找到其他方法来实现目标,或者转到具有 root 权限并可以修改 的解决方案httpd.conf

其他资源

你在你的网站上用过什么工具.htaccess?有什么你想用.htaccess但还没想好的东西吗?请在评论区留言告诉我!

文章来源:https://dev.to/thejessleigh/quick-and-dirty-htaccess-for-small-personal-sites-2cfn
PREV
3 个棘手的 Python 细微差别 细微差别一 细微差别二 细微差别三 结论
NEXT
使用 Flutter 构建食谱应用 🍳 使用 Flutter 构建食谱应用