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的速度有影响。

0条评论:

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

正文:

  记住信息?

直接发送Trackback到此文章

说明:本评论系统不支持HTML代码。(您的留言需要审核,审核规则请见这里。)

文章分类 Category:
真相与UFO Truth and UFO
编程 Program
PHP
Blog的发展 Development
为什么写博客 W-do we Blog
互联网 Internet
BBS社区研究 Community
QQ研究 QQ Research

置顶的文章:
短信验证开发的方案分享
我的3种博客写作方法
最大的公益事业是UFO
巡回更新:2018-09-21
速度是永恒的主题
UTF-8、HTTPS原来都是浮云
为什么写技术(2018.9.23写)

近期的主题:
UTF-8、HTTPS原来都是浮云
为什么写技术
暂时放弃了开发VPS面板的想法
速度是永恒的主题
2017.12-2018.9写的博客
巡回更新:2018-09-21
2017.7第2篇
auiou.com今天换上了KVM
CentOS, Debian, Ubuntu三种VPS系统的LAMP属性小结
Debian 6.0和Ubuntu 14.04新装机的参数记录
Linux VPS的速度优化
Nginx与.htaccess
CentOS 6新装机的参数记录
auiou.com的VPS的内存占用测试
2016年8月第一帖
不喜欢锻炼身体的朋友
看《第五空间》
看《爱情公寓》的一点感想
生命的意义在于每一天都是人生的开始
安卓机顶盒收到小记
人生中最可怕的事情是拖延
不能贪吃/不能贪喝/不能贪凉
“世面”和人生意义
计划推出一个重要的“网络存档”(网络记事本)快速小程序
最近几个月博客更新减缓的原因
汽车越来越多
编写完成了清爽的贴吧浏览程序/贴吧占用内存测试
猫/无线路由器/瑞银无线网卡 最简单有效的散热方法
最近录制的歌
家用无线路由器选购的一些建议
网络电视机顶盒选购的一些建议
无线路由器当作无线交换机实例
2013-08-08:人生的意义&谨言慎行
怎样对治重症的拖沓的毛病?
磊科NW336无线网卡使用感受
腾达311R无线路由器频繁掉线解决一例(其它品牌和型号可能也适用)

王志勇:程序设计者。
1980-09-26 (38周岁)

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

与此相关的链接
自由勇专栏 | Arsue官方Blog

54.225.59.14 2018-09-23_05:58 | CCBot/2.0 (https://commoncrawl.org/faq/) ---
Time | Taimt | Caimt | ac315 | Arsue | IC Search | TDNote 帖笛 | HKANS | Vaimt Panel | txfor | 网树 | cdfor | 性格追踪仪 | Gratitude | IXNes | Tratom | Coumit | Serble | Aufirm | Aroat | Sail every day | Tuarm | Sail every day | Webshu | Sinvide | Aucist | Anydiary | Cersta | Tovate | Matnue | Urtal | Auciou | Auciou's column

Blog存档 Archives

2018年09月
2016年-2017年(9)
2014年06月-09月(10)
2013年 +

2012年 +
2011年 +
2010年 +
2009年 +
2008年 +
2007年 +
2006年 +
2005年09月(4)

Copyright © 2006-2018 auiou.com All rights reserved.
此Blog程序由王志勇编写 已经发布在Arsue