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;
}
本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。