关于Nginx支持.htaccess的分析

之前曾在Typecho开发群中与王轶讨论了关于Nginx支持.htaccess文件的问题。王轶认为,Nginx能够支持.htaccess规 则,且兼容Apache规则。我认为,Nginx支持使用.htaccess文件来存储Nginx的伪静态规则,不兼容.htaccess规则。
我之所以这么说,是有原因的,我查阅了Nginx的官方文档文档1/文档2, 文档1是Nginx的Rewrite模块的doc,详细的解释了nginx的rewrite规则组成,在其中,我没有找到关于Apache的规则,在文档 2中,文档说明了为什么不使用.htaccess文件 并将Nginx和Apache进行比较。众所周知,Nginx不支持.htaccess规则,开源中国的站长红薯曾发过一篇文章:谁说nginx不支持.htaccess,在我看来,红薯是在混淆视听,偷换了概念,我们说的是.htaccess规则,而红薯说的是.htaccess文件。
说了那么多废话。接下来我分析一下nginx为什么不支持.htaccess,主要有以下几个方面。
1. 性能需要:在文档2中我们可以知道,Apache处理伪静态规则时会依次搜索各个目录下的.htaccess文件,这样就会造成大量的查询,影响性能,与Nginx的设计理念不符。
2. 软件模式决定:Apache设计时便是动态加载这一点,可以从Apache处理.htaccess文件看出来。你修改了.htaccess后,就可以马上 生效,包括Apache加载模块也是动态加载,而Nginx则是写死的规则,修改后需要重载nginx才可以.Tengine虽然提供了动态加载模块,但 仍需要重载设置才能生效,可以说是在”伪动态”。
3. 北方毛熊的自尊心作祟:Apache后面有美帝的身影,毛熊们觉得要是兼容了就有点低声下气。所以搞出自己的版本。
关于.htaccess应用于Nginx的可行性分析。在我看来,.htaccess不可能应用于LNMP平台的商业化。主要有以下几个原因:
1. 安全性较低。
由于Nginx是先加载配置文件,然后才运 行,所以,如果你用的虚拟主机有一个爱折腾的邻居,万一那个家伙手残了,改错了,你也会无法访问,随之遭殃。
2. 操作不便。
Nginx因为是先载入配置文件,所以,在每次修改完需要重启Nginx,你是否给用户ssh密码以方便其重启?如果不给密码使用php中的exec,又会有跨站的危险。如果开启了Chroot,exec就没有效果了。
总结:实际上nginx不仅仅支持.htaccess文件,你甚至可以使用.mp3来放伪静态规则。但是,为了安全起见,我建议你使用默认的conf文件来保存rewrite规则。毕竟,说不定那天手贱就把目录清空了,规则就没了。Nginx也因此崩溃
原文地址

完美解决nginx下wordpress固定链接404错误的方法

天在wordpress 下配置文章固定链接的时候,遇到了404的错误。我首先在wordpress下的设置里的“固定链接”配置页面,自定义链接的结构 “https://www.osetc.com/%postname%/,保存更改后,文章无法打开,无论是新编辑的文章还是之前的,都会出现404错误。那么这个问题该如何解决呢?或者说如何在ngix server解决这种问题?
首先我们应该更改网站域名所对应的配置文件,该配置文件的配置可以参照阿里云官方提供的nginx服务器配置视频。 比如本网站域名对应的conf文件为
osetc.com.conf.
默认的配置文件如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
server {
listen       80;
server_name  www.osetc.com;
index index.html index.htm index.php;
root /alidata/www/osetc.com;
//注意此处,将下面的几行if代码copy到这里
location ~ .*.(php|php5)?$
{
#fastcgi_pass  unix:/tmp/php-cgi.sock;
fastcgi_pass  127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi.conf;
}

需要添加的代码:

1
2
3
4
5
6
7
8
9
if (-f $request_filename/index.html){
rewrite (.*) $1/index.html break;
}
if (-f $request_filename/index.php){
rewrite (.*) $1/index.php;
}
if (!-f $request_filename){
rewrite (.*) /index.php;
}

上面的代码也可以从ngix安装目录下获得:

1
2
3
[root@osetc.com]#ls /nginx-1.0.4/conf/rewrite
default.conf     discuz_x2.conf  phpcms.conf   shopex.conf
discuz_7.2.conf  ecshop.conf     phpwind.conf  wordpress.conf

打开上面wordpress.conf文件,你就可以看到我们要添加的代码