路漫漫其修远兮
吾将上下而求索

nginx学习:rewrite,gzip,fastcgi,ssl,referer

Nginx(3)

ngx_http_rewrite_module模块:

The ngx_http_rewrite_module module is used to change request URI using PCRE regular expressions, return redirects, and conditionally select configurations.

将用户请求的URI基于regex所描述的模式进行检查,而后完成替换;

http://nginx.org/en/docs/http/ngx_http_rewrite_module.html

1、rewrite regex replacement [flag]

将用户请求的URI基于regex所描述的模式进行检查,匹配到时将其替换为replacement指定的新的URI;

注意:如果在同一级配置块中存在多个rewrite规则,那么会自上而下逐个检查;被某条件规则替换完成后,会重新一轮的替换检查,如果再次检查符合某条规则,还会进行替换。因此,隐含有循环机制;[flag]所表示的标志位用于控制此循环机制;

如果replacement是以http://或https://开头,则替换结果会直接以重定向返回给客户端;

301:永久重定向;

[flag]:

  last:重写完成后停止对当前URI在当前location中后续的其它重写操作,而后对新的URI启动新一轮重写检查;提前重启新一轮循环; 类似于循环中的continue,

  break:重写完成后停止对当前URI在当前location中后续的其它重写操作,而后直接跳转至重写规则配置块之后的其它配置;结束循环;类似于循环中的break,跳出整个循环

  例如:rewrite ^/forum/(.*)$ /admin/$1 break; 后面添加就可以

  redirect:重写完成后以临时重定向方式直接返回重写后生成的新URI给客户端,由客户端重新发起请求;不能以http://或https://开头;

  permanent:重写完成后以永久重定向方式直接返回重写后生成的新URI给客户端,由客户端重新发起请求;和redirect一样,只是状态码变成了301永久重定向

下面是一个示例

[root@localhost /usr/local/nginx/conf/conf.d]#cat 80.conf
server {
    listen       80 default_server;
    root /data/web;

    location / {
        index index.html index.htm;
    }

    error_page 403 404 /404.html;

    location = /404.html {
        root /data/web/error;
	}
}

在web目录创建一个forum目录

[root@localhost /data/web]#cd forum/
[root@localhost /data/web/forum]#cat index.html 
<h1>/data/web/forum/index.html</h1>

下面是正常的访问

image.png

假如网站以前的路径是bbs,但是后来将路径更换为了forum,但是用户还是习惯使用bbs路径来访问,当bbs目录不存在的时候,会报错

image.png

这里可以利用rewrite模块来进行重写

[root@localhost /usr/local/nginx/conf/conf.d]#cat 80.conf
server {
    listen       80 default_server;
    root /data/web;

    location / {
        rewrite ^/bbs/(.*)$ /forum/$1;
        index index.html index.htm;
    }


    error_page 403 404 /404.html;

    location = /404.html {
        root /data/web/error;
	}
}

当访问:http://192.168.175.11/bbs 的时候,实际是访问的forum目录,但是url显示的仍然是bbs路径。 

image.png

这里有一个假设不知道对不对

这是一个博客地址:http://blog.oldboyedu.com/pptp-l2tp/  域名对应的IP为:101.200.195.98:80

这是博客地址里面的图片:http://cdn.oldboyedu.com/wp-content/uploads/2016/09/092616_0318_ITProc1.png

得到域名cdn.oldboyedu.com的远程ip为:Remote Address:124.193.230.158:80,为某一家cdn的地址

按理说一个博客是没有钱自建cdn的,但是怎么做到:使用他人的cdn,但是显示的是自己的域名,怎么达到这种效果呢

在nginx的配置里面写入:rewrite cdn.oldboyedu.com/(.*)  某个cdn图片的真实的url/$1

这样做的好处:当更换了cdn的厂家的时候,只需要更改rewrite后面的url,

 当请求(http://cdn.oldboyedu.com/wp-content/uploads/2016/09/092616_0318_ITProc1.png)这个图片的时候,其实是去某个cdn那里取得了图片,但是url仍然显示的是cdn.oldboyedu.com,,,,,显示的好像是自己的cdn一样,好专业

在博客的后台可以添加图片的url,这里填入:cdn.oldboyedu.com,这样上传的图片的url路径都会是以这个域名开头的路径,并保存在数据库中,这个图片的文件路径url就永远不变了。

如果有cdn的话应该会将这个图片目录同步到cdn的云存储中,

不知道对不对,还要请教别人

redirect测试

[root@localhost /usr/local/nginx/conf/conf.d]#cat 80.conf
server {
    listen       80 default_server;
    root /data/web;

    location / {
        rewrite ^/bbs/(.*)$ /forum/$1 redirect;
        index index.html index.htm;
    }


    error_page 403 404 /404.html;

    location = /404.html {
        root /data/web/error;
	}
}

当在浏览器中输入: 
并将这个url返回给客户端,状态码302临时重定向,由客户端重新发起请求:http://192.168.175.11/forum,最后显示出来

这里在浏览器里显示的url是重定向后的真实的url,

也可以转向其他网站:rewrite ^/bbs/(.*)$ https://www.baidu.com redirect; 那么访问bbs网页的时候会跳转到某度上面

2、return

  return code [text];

  return code URL;

  return URL;

  Stops processing and returns the specified code to a client. 

3、 rewrite_log on | off;

  是否开启重写日志;

4、 if (condition) { … }

  引入一个新的配置上下文 ;条件满足时,执行配置块中的配置指令;server, location;

  condition:

    比较操作符:

      ==

      !=

      ~:模式匹配,区分字符大小写;

      ~*:模式匹配,不区分字符大小写;

      !~:模式不匹配,区分字符大小写;

      !~*:模式不匹配,不区分字符大小写;

    文件及目录存在性判断:

      -e, !-e

      -f, !-f

      -d, !-d

      -x, !-x

5、set $variable value;

  用户自定义变量 ;

ngx_http_gzip_module:

  The ngx_http_gzip_module module is a filter that compresses responses using the “gzip” method. This often helps to reduce the size of transmitted data by half or even more.

1、gzip on | off;

  Enables or disables gzipping of responses.

2、gzip_comp_level level;

  Sets a gzip compression level of a response. Acceptable values are in the range from 1 to 9.

3、 gzip_disable regex …; #在请求报文中会有:User-Agent首部,只要包含关键字就可以生效

  Disables gzipping of responses for requests with “User-Agent” header fields matching any of the specified regular expressions.对哪个浏览器关闭压缩功能

4、 gzip_min_length length;

  启用压缩功能的响应报文大小阈值;文件小于多大的时候就不压缩了。比如只有20字节,压缩没有意义

5、gzip_buffers number size;

  支持实现压缩功能时为其配置的缓冲区数量及每个缓存区的大小;

6、gzip_proxied off | expired | no-cache | no-store | private | no_last_modified | no_etag | auth | any …;

  nginx作为代理服务器接收到从被代理服务器发送的响应报文后,在何种条件下启用压缩功能的;

  off:对代理的请求不启用

  no-cache, no-store,private:表示从被代理服务器收到的响应报文首部的Cache-Control的值为此三者中任何一个,则启用压缩功能;

7、gzip_types mime-type …;#在/etc/nginx/mime.types 指明可以压缩的格式类型

  压缩过滤器,仅对此处设定的MIME类型的内容启用压缩功能;

未经允许不得转载:江哥架构师笔记 » nginx学习:rewrite,gzip,fastcgi,ssl,referer

分享到:更多 ()

评论 抢沙发

评论前必须登录!