我是靠谱客的博主 美好天空,最近开发中收集的这篇文章主要介绍例解Nginx路径映射,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

本例中的站点层次结构如下所示:

URLLocal PathDescription
www.lotus-scent.com/usr/www/www.lotus-scent.com网站的homepage,静态页面
www.lotus-scent.com/dojodoc/usr/www/dojodocdojo的官方文档由于处于google/aol子域下,由于某些原因有时不能正常访问,建立本地服务器映像
www.lotus-scent.com/blog/usr/www/blogwww.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路径映射所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(70)

评论列表共有 0 条评论

立即
投稿
返回
顶部