Nginx与.htaccess

王志勇 发表于 2016年08月24日 07:25

本文通过Nginx与Apache的不同,讨论.htaccess。最近开始测试Nginx,查阅了很多Nginx的网页,可悲国内太多文章是转来转去,甚至有很多是没有经过验证的、错误的。经过测试,Nginx实质上并不像Apache一样支持.htaccess,也就是说实质上目前并不支持.htaccess。而是目前的Nginx,直接支持Rewrite。

Nginx使用Rewrite的方法,网上有2种,一种是在/etc/nginx/nginx.conf文件里的站点设置server{}里写上include …….htaccess语句,第二种方法是同样在server{}的位置,直接写上Rewrite的语句。实际上,这两种方法是同一种。

这里讨论实现伪静态的Rewrite和404页,这两者是不一样的。

国内使用Wordpress、Discuz的用户,多数人是在站点根目录建立.htaccess,在此文件写入Rewrite语句,但较少人是用Apache的404页来实现伪静态。这两者实现的效果是一模一样的,相比较而言,Rewrite有2个缺点,一是需要调用Rewrite模块、二是正则表达式规则不易使用。用404页来实现伪静态,正好克服了这2个缺点,因为404错误的功能是Apache内置的,用$aa=$_SERVER['REQUEST_URI'];来获取地址栏,用explode("&",$aa)来提取地址栏的所有参数,会有极大的灵活性,并重新处理。

甚至可以看出调用Rewrite模块在多数情况下,是不必要的,因为被Rewrite调用的动态页面,同样要用$_GET["name"]来获取参数值。而404页的伪静态,通过explode()函数已经分析出了这些参数值。这等于多调用了一个Rewrite模块。

但有一种情况必须用Rewrite模块,就是伪静态后的页面,如果它是接受Post提交的页面,这时不能用404页。而Get的页面,可以用404页。

经过测试,发现Nginx与Apache的Rewrite过程几乎是相同的,如果.htaccess是放置在站点的根目录,那么这个过程几乎是完全相同的,也就是这个Rewrite的规则对站点的所有页面都发出了指令,或者说是整站的全局设置。例如,在站点根目录里的.htaccess,有一条规则是对abc.php进行伪静态重写,而如果被访问的页面是def.php,虽然没有对def.php进行伪静态重写,但是def.php也接收到了对于abc.php的重写规则,只是没有对def.php产生作用。不仅如此,根目录的.htaccess对站点的所有页面都会发出指令。对于访问量不大的站点,可能影响较小,但是访问量大的站点是有一定影响的。
简单地说,如果把.htaccess放在根目录,是对整站的全局设置(Nginx与Apache都是这样的)。

可能有朋友会想到,如果把Nginx所include的.htaccess文件,不放在根目录,是不是就能避免全局设置?Apache可以避免,但是Nginx避免不了。因为Nginx所include的文件,无论.htaccess文件是处于哪层目录,它的作用级别,都是全局的,这是因为include起的作用只是引用代码而已,它还是在server{}这里产生作用。

Apache的.htaccess,经过测试,是对当前目录、以及它的所有子目录生效。例如,如果把.htaccess放在根目录,则对整站有效。如果把.htaccess放在/abc目录,则只对/abc目录和/abc的所有子目录有效。对于程序开发者而言,是不会把.htaccess放在网站根目录(因为会产生不必要的全局设置),而是在需要Rewrite的目录建立一个.htaccess文件(更好的解决办法是用404来实现伪静态)。

既然Nginx不能避免Rewrite的全局设置,也就是让目录下的.htaccess生效,那么我们试一试Nginx能不能用404页来实现伪静态?结果太遗憾了。Nginx虽然支持自定义404错误页,但是访问伪静态的链接,马上跳转到404的文件页面。而Apache,则是停留在伪静态的链接,不会跳转。

由此可见,无论是Rewrite、还是404页,Apache都比Nginx完善。在此看来,目前的Nginx如果能够改进这两方面,就会成为PHP的Web服务器的首选。

在打开网页方面,Nginx确实比Apache快很多。究竟为什么快,需要做很多的测试,或者在某一天就会无意间发现原因。我打开VPS的Apache的配置文件,发现LoadModule语句,竟然加载了52个模块。而我在本机测试的miniapache(迷你Apache),只加载7个模块。这些模块加载得太多,可能对Apache的速度有影响。

2条评论:
1   自由勇 2018-10-23 10:55
Trackback来自《2015年的一小段回忆录

我调试、长期使用的环境中,仍然以Apache为主,这是因为很遗憾的是Nginx的伪静态只能全局,不能像Apache一样使用.htaccess的404错误页。Nginx其实差一点就可以支持了,遗憾的是作者把404错误页变成了跳转到404页,如果能像.htaccess一样不跳转,那么在这种特定的应用下,Nginx能够代替Apache。

2   自由勇 2018-11-08 07:52
Trackback来自《为什么近期写了很多的VPS新机安装和配置的博客

Apache和Nginx的环境,在配置上有较多的不同。我的主力环境以Apache为主,但是大家的服务器大多以Nginx为主。为什么我会以Apache为主?因为Nginx距离完美,只差小小的一步:Nginx不支持.htaccess,如前文。技术上完全能支持,但是很遗憾,作者没有开发。当然,目前的最高版本Nginx我没有测试过,改天写一个测试的记录。

3   自由勇 2019-04-09 11:06
Trackback来自《为什么我一直用Apache而不用Nginx?

因为Nginx离完美,只差小小的一步:Nginx一是不支持.htaccess;二是不支持404页伪静态。这2项,Apache都完美支持。

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

正文:

  记住信息?

王志勇:1980-09-26 (44周岁)
程序设计,前端设计。

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

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

Blog存档 Archives

2022年07月
2022年06月(15)
2022年05月(20)
2022年04月(16)
2022年03月(9)
2022年02月(9)
2022年01月(10)
2021年 +

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

Copyright © 2006-2024 auiou.com All rights reserved.
此Blog程序由王志勇编写