转自 关于Nginx支持.htaccess的分析

nginx为什么不支持.htaccess?

1.性能需要

在Nginx的官方文档我们可以知道,Apache处理伪静态规则时会依次搜索各个目录下的.htaccess文件,这样就会造成大量的查询,影响性能,与Nginx的设计理念不符。

2.软件模式决定

Apache设计时便是动态加载这一点,可以从Apache处理.htaccess文件看出来。你修改了.htaccess后,就可以马上生效,包括Apache加载模块也是动态加载,而Nginx则是写死的规则,修改后需要重载nginx才可以.Tengine虽然提供了动态加载模块,但仍需要重载设置才能生效,可以说是在”伪动态”。

为什么.htaccess不可能应用于LNMP平台的商业化

1.安全性较低

由于Nginx是先加载配置文件,然后才运行,所以,如果你用的虚拟主机有一个爱折腾的邻居,万一那个家伙手残了,改错了,你也会无法访问,随之遭殃。

2.操作不便

Nginx因为是先载入配置文件,所以,在每次修改完需要重启Nginx,你是否给用户ssh密码以方便其重启?如果不给密码使用php中的exec,又会有跨站的危险。如果开启了Chroot,exec就没有效果了。

总结

实际上nginx不仅仅支持.htaccess文件,你甚至可以使用.mp3来放伪静态规则。但是,为了安全起见,我建议你使用默认的conf文件来保存rewrite规则。

如何引入.htaccess文件(后缀可以是任意字符串)

在虚拟主机server内添加

include /xxx/xxx/xxx/.htaccess;

注:因为不支持.htaccess规则,所以在检测配置文件nginx -t时,会报错:nginx: [emerg] unknown directive "<IfModule",这是因为规则不一样。

Apache重写

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /

    RewriteCond %{REQUEST_URI} ^system.*
    RewriteRule ^(.*)$ /index.php?/$1 [L]

    RewriteCond %{REQUEST_URI} ^application.*
    RewriteRule ^(.*)$ /index.php?/$1 [L]

    RewriteCond %{HTTP_REFERER} !^https?://(.+.)?cohcreate.com/.*$ [NC]
    RewriteRule .*.(jpg|gif|png|bmp|swf|jpeg|mp4) /error/daolian.jpg [R,NC,L]

    RewriteCond $1 !^(index.php|assets|upload)
    RewriteRule ^(.*)$ index.php?/$1 [L]
</IfModule>

nginx重写(基于location上下文rewrite功能)

location / {
    root /www/site1.org;
    index index.html index.htm;
    rewrite ^/images/(.*)$ /imgs/$1 last;
  }