概述
本例中的站点层次结构如下所示:
URL | Local Path | Description |
www.lotus-scent.com | /usr/www/www.lotus-scent.com | 网站的homepage,静态页面 |
www.lotus-scent.com/dojodoc | /usr/www/dojodoc | dojo的官方文档由于处于google/aol子域下,由于某些原因有时不能正常访问,建立本地服务器映像 |
www.lotus-scent.com/blog | /usr/www/blog | www.lotus-scent.com 开发人员博客,采用wordpress构建 |
为实现上述层次结构,在server层次下不定义root,所有目录映射放到location一级定义。对根的映射:
location / {
root /usr/www/www.lotus-scent.com;
index index.html index.htm;
}
由于是静态文件,因些只需要定义目录映射即可。
对于dojodoc,定义如下:
location /dojodoc {
root /usr/www/;
autoindex on;
expires 365d;
access_log off;
}
Nginx在解析URL后,后自动将dojodoc附加到根目录/usr/www之后,所以最终生成的文件查找路径为/usr/www/dojodoc。本目录下不但为静态文件(含js),而且几乎从不更新,所以设置expires选项以最大限度利用HTTP缓存。
下面来看blog的映射,首先是:
1 location /blog {
2 root /usr/www;
3 #without this line, access to http://.../blog will yield 404
4 fastcgi_index index.php;
5 if (!-e $request_filename) {
6 rewrite ^/blog/index.php/(.+)$ /blog/index.php?q=$1 last;
7 break;
8 }
9 include fastcgi_params;
10 fastcgi_pass localhost:9000;
11 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
12 }
首先,由于server一级并未定义root,所以在这一级必须定义root。为了能让 http://www.lotus-scent.com/blog能指向 http://www.lotus-scent.com/index.php,需要声明'fastcgi_index index.php'这一句。注意,这里针对静态页面使用的'index'指示是不起作用的。
行5~8实现了地址改写。如果一个URL并不是对应着本地的一个静态文件,那么意味着这个地址所请求的内容需要由PHP动态生成,因此,需要进行地址改写。请看第6行。这一行用来处理类似于http://www.lotus-scent.com/index.php/test1 这样的地址。该地址是一个wordpress的固定链接地址,使用了PATHINFO固定链接技术技术(参见使用固定链接)。这样就需要通过Nginx将该地址转换成常规的wordpress地址,再交由php来处理。通过行8的声明,地址改写首先匹配到该地址,然后生成新地址/blog/index.php?q=test1,跳出本次匹配。由于使用了rewrite,因此Nginx通过内部重定向启动再次匹配,'location /blog'再次命中。此次$request_filename为/usr/www/blog/index.php,存在于服务器上,所以跳过行5~8的处理,由行9~11来处理,也就是php来处理。这样,通过地址改写来实现了wordpress的基于PATHINFO技术的固定链接。
如果仔细研究上面的location定义,你会发现对于静态文件,如果该文件是.php文件,那么由PHP引擎来处理(第9~11行)是十分恰当的。但如果该静态文件是js文件或者css文件,显然应该由Nginx直接发送给客户端,不需要PHP引擎来处理。因此,必须专门针对静态文件来定义:
1 location ~* /blog/.*.(?:ico|css|js|gif|jpe?g|png)$ {
2 root /usr/www;
3 # Some basic cache-control for static files to be sent to the browser
4 expires max;
5 add_header Pragma public;
6 add_header Cache-Control "public, must-revalidate, proxy-revalidate";
7 }
注意第1行括号中的"?:"。它与括号用在一起,表明要匹配括号中的ico,css,js等文件格式中的任意一个即可,但是对于匹配结果无须保存。这是一种提高性能的方式。具体请看正则表达式的语法。
注意这个location是正则表达式匹配,前面那个location是literal匹配,根据Nginx路径匹配的规则,正则表达式匹配一旦成功,就会跳过literal匹配,因此实现了Nginx直接发送静态文件,而不经过PHP引擎处理的要求。关于Nignx路径匹配的优先级问题,请参见Nginx配置文件解析
最后
以上就是美好天空为你收集整理的例解Nginx路径映射的全部内容,希望文章能够帮你解决例解Nginx路径映射所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复