Nginx与.htaccess(2)

王志勇 发表于 2026年11月09日 22:30

(网上也有很多人说Nginx支持,本文将会解释为什么不支持。) .htaccess网上的教程非常少,几乎接近于零。Nginx不支持.htaccess!不支持.htaccess,不支持.htaccess!重要的事情说3遍。Nginx的的确确不支持.htaccess!Nginx距离完美,就差这一步。本文是2016年时写的《Nginx与.htaccess》这一篇的延续,当时是想呼吁Nginx的开发方,能早日支持.htaccess,我马上就投奔Nginx。正是因为Nginx不支持.htaccess,所以我一直使用Apache。因为现在Nginx对http2、http3的支持非常好,更新很及时,Apache在http3的支持(自带模块)目前是完全没有(以2026年10月1日发布的最新版Apache 2.4.69,系统为Debian 13.7为例)。

.htaccess就是PHP的生命,主要是实现伪静态、临时修改Apache配置、php.ini配置等作用。.htaccess有多重要?本博客的语言现在是用PHP写的,正是使用.htaccess实现的改写扩展名为别的语言,比如能改成.jsp,.aspx,.html等任意扩展名,全站找不出一点PHP的痕迹。至少有4种方法能实现修改语言的扩展名,2021年时在这里公布了。巧合的是,今天引用的这2个旧链接,文章ID一个是888,一个是1888。这种巧合的概率是多少?为什么我今天会写这篇博客?(我最近完成的高防程序也必须用到.htaccess,绝对不能缺少,用于自动拦截很多非(隔开)法请求、空链接。)

网上也有很多人说,Nginx支持.htaccess,方法是在Nginx的配置文件/etc/nginx/nginx.conf里,写入这句:

include /var/www/html/abc.com/.htaccess;

然后在这个/var/www/html/abc.com/.htaccess的文件里,写入Rewrite,实现伪静态。

这也是网上唯一能找到的让Nginx支持.htaccess的方法。因为我隔一段时间,会关注Nginx有没有推出支持.htaccess的功能。

非常遗憾,这并不是真正的支持.htaccess,而是Nginx支持在配置文件里使用include语句。此时,如果把这个.htaccess更改为别的任意文件名,也一样能正常运行,例如abc.conf,那么相应的include语句是:

include /var/www/html/abc.com/abc.conf;

这只能说明Nginx的配置文件支持include,实质并不支持.htaccess。

怎样才是真正的支持.htaccess?
就是在配置文件里,不需要写入这句include语句,而在站点建立.htaccess文件,此时.htaccess文件里写入的语句,会生效。

Apache的.htaccess文件,就是这样工作的,不需要在配置文件里写入include语句,直接在站点建立.htaccess文件即可。

Apache的.htaccess文件,有个很大的特性,就是会对当前的目录、以及当前目录下的所有子目录生效。

例如:

1. 在站点的根目录下,建立abc.com/.htaccess,这个.htaccess会对整个站点的根目录、以及所有子目录起作用。

2. 在站点的二级目录,建立abc.com/folder1/.htaccess,这个文件会对abc.com/folder1目录、以及abc.com/folder1下的所有子目录起作用。同时,第1步在网站根目录下建立的.htaccess,也会对abc.com/folder1下的所有子目录起作用。

如果这2个.htaccess文件里写入了相同的指令,会优先执行abc.com/folder1/.htaccess这个文件里的配置。

Nginx的.htaccess,和Apache的.htaccess,有什么不同?
Apache在非常早的版本,就支持.htaccess。我是在2009年时,学会的PHP,那个时候的Apache就支持.htaccess。

到了2026年,Nginx至今仍然不支持.htaccess。

我是怎样学会使用.htaccess的?是因为底层需求:伪静态。网上的教程非常少,几乎接近于0。

因为在200X年的那个时代,所有的动态网页,扩展名都是.asp,.php,中国的互联网上只有这2种语言。到了2003年~2005年,中文有了博客,那时候已经有博主会使用伪静态,非常酷!

能把一个abc.php?id=1233转化为abc/1233.htm,或者abc/1233这样的链接,这就是伪静态。

实现伪静态的方法,主要有2种,目前到了2026年,绝大多数博客都是使用Rewrite;另一种是404错误页,用header('HTTP/1.1 200 OK')语句改为200代码,这种方法已经几乎彻底失传,我一直是用这个方法,因为404错误能节省一个Rewrite模块。

这种404错误页的方法,我当时是从plod.popoever.com的博主学习到的,整个互联网只有他分享过这个方法,记得好像他是在蓝色理想的论坛里分享的。

Nginx的.htaccess,和Apache的.htaccess,有什么不同?
1. Nginx的.htaccess,是强行把一个配置文件改名为.htaccess,然后在Nginx的配置文件里用include,来包含这个文件。

Nginx的这个方法,等效于把.htaccess文件里的内容,写入到Nginx的配置文件,是对整个站点的所有目录有效,属于全局设置,会占资源。

2. Apache的.htaccess,可以设置对整个站点的所有目录有效,属于全局设置;也可以只单独对一个目录有效,方法是把.htaccess文件放在子目录里,属于局部设置。

简言之,Nginx强行建立的.htaccess文件,只能建一个(当然,也可以同时include多个文件,但本质上include多个文件就等于include一个文件,因为include等效于把include文件里的内容,写入到Nginx的配置文件);Apache可以建立无限个.htaccess文件。

为什么Nginx不支持.htaccess?
网上有一种说法是由于Apache的.htaccess文件,会对整个站点起作用,会占资源。其实,确实会对整个站点起作用,但那是网站根目录的.htaccess文件。

Apache完全可以解决这个问题,就是网站根目录的.htaccess文件,控制语句要尽量少写。Rewrite语句,或者404错误页语句,在相应的二级目录、或三级目录建立.htaccess文件。

.htaccess这么重要的作用,Nginx不支持,大概的原因有这2个:

1. 开发者把所有的Rewrite语句写入到Nginx的配置文件,或者使用include的方法。include等效于直接写在配置文件。

2. 尽管Nginx已经发展为伟大的服务器后台,Nginx的开发者本人,也可能尚未使用过Apache的.htaccess功能,造成了关键信息衔接不足。因为会使用Apache的.htaccess的人,非常少,只是某个时间段,在网络上流行了一阵,这个时间段大约在2008年~2011年,其余的时段都是失传的。

从Nginx的404错误页的PHP文件用header('HTTP/1.1 200 OK')改为200代码,会跳转到404错误网页,就能看出来,Nginx的开发者尚未使用过Apache的.htaccess功能,而是在Apache的配置文件里写Rewrite。因为Apache的404错误页,不会跳转,我就是用Apache的.htaccess的404错误页,实现所有的伪静态。

假如将来Nginx能够支持.htaccess,且.htaccess指定的404错误页不会跳转到404错误网页,并不存在模仿,而是基本的技术需求,这2条,Apache都是完美支持的。

0条评论:

发表评论:
名字: (*必填)
博客: (可省)

正文:

  记住信息? 是 否

王志勇:1980-09-26 (46周岁)
程序设计,技术开发,Web站长

版权声明:本博客所有文章,均符合原创的定义,禁止转载,违者将必究;正确的方法是贴原文的标题和网址即可。

与此相关的链接
自由勇专栏

Blog存档 Archives

2025年-2026年03月(10)
2024年(13)
2023年 +

2022年 +
2021年 +
2020年 +
2019年 +
2018年 +
2016年-2017年(9)
2014年06月-09月(10)
2013年 +
2012年 +
2011年 +
2010年 +
2009年 +
2008年 +
2007年 +
2006年 +
2005年09月(4)

Copyright © 2006-2026 auiou.com All rights reserved.
此Blog程序由王志勇编写
生产环境提示:博客属专业平台,访问者多为专业用户,http模式能承载更高的峰值吞吐量。