我是靠谱客的博主 彩色狗,最近开发中收集的这篇文章主要介绍Nginx 重写URI重写URI,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

重写URI

 

    我们在使用Nginx的过程中经常碰到需要将客户端访问者的URI进行重写,在“根据浏览器选择主页”部分多少有些认识这种做法,另外我们我们在“map模块的使用”部分也见到和改写过,但是它们都没有rewrite模块强大,因此,在这一部分我们看看rewrite的用法。

 

    使用rewrite模块离不开正则表达式,因此,要想使用rewrite指令,那么就必须在安装Nginx时指定pcre

 

使用该模块通过正则表达式(PCRE)就可以改变URI,并且可以重定向和根据变量来选择配置。如果在server级别执行rewrite指令,那么请求将在location确定之前执行。如果在被选择的location中仍有rewrite指令,那么它们同样被执行,如果在这个location中又触发访问到rewrite指令,那么就会再次改变URI。这种被重复周期为10才, 在10次之后仍然找不到具体的URI,那么Nginx将会返回500错误。

 

配置示例

 

rewrite ^/(/d+)/(.+)/ /$2?id=$1 last;

 

rewrite ^/([0-9a-z]+)job/(.*)$ /area/$1/$2 last;

 

if (-d $request_filename){

rewrite ^/(.*)([^/])$ http://$host/$1$2/ permanent;

}

 

if ($http_host ~* "^(.*)/.st/.xx/.com$") {

rewrite ^(.*) http://st.yy.com$1;

break;

}

 

if ($host ~* (.*).xx.com) {

           set $sub_name $1; 

           rewrite ^/sort/(d+)/?$ /index.php?act=sort&cid=$sub_name&id=$1 last;

       }

 

if ($http_user_agent ~ MSIE) {

           rewrite ^(.*)$ /var/www/ie/$1 break;

}

   

 

安装PCRE

 

    下载并安装pcre

 

[root@s29 ~]# wget ftp://ftp.csx.cam.ac.uk/pub/software

> /programming/pcre/pcre-8.13.tar.gz

[root@s29 ~]#tar -zxvf pcre-8.13.tar.gz

[root@s29 ~]#cd pcre-8.13

[root@s29 pcre-8.13]#./configure --prefix=/usr/local/pcre-8.13  

> --enable-utf8 --enable-unicode-properties

[root@s29 pcre-8.13]#make

[root@s29 pcre-8.13]#make install

   

    需要注意的是,在安装Nginx:

 

[root@mail nginx-1.0.2]# ./configure --prefix=/usr/local/nginx-1.0.2-pcre-8.13

> --with-pcre=/root/pcre-8.13

 

   ……

 

Configuration summary

  + using PCRE library: /root/pcre-8.13

  + OpenSSL library is not used

  + md5: using system crypto library

  + sha1 library is not used

  + using system zlib library

 

   ……

 

   

    这里的--with-pcre指定的是pcre-8.13的源码,但是在Nginx的安装过程中会查找pcre安装的具体情况:

 

.....//无法上传省略

 

 

指令名称:if

    : if (condition) { ... }

默 认 值: none

使用环境: server, location

    能:用于检测条件是否成立,如果条件被评估为真,那么在大括号“{}”中代码将会被执行,同配置中一致的请求将会被处理。if指令内部的配置会被从上一级继承。需要注意的是,使用if指令要谨慎,尽量考虑是try_files指定。

 

条件condition部分可以指定下列值:

 

n  使用= !=操作符比较变量的表达式;

n  变量名称,如果变量名称为false,那么值将会是一个空字符串(""),或者是

任何以"0"开始的字符串

n  使用正则表达式的模式匹配:

u             ~    执行区分大小写匹配;

u             ~*   执行不区分大小写匹配;

u             !~   执行区分大小写不匹配

u             !~*  执行不区分大小写不匹配

n  使用 -f 或者 !-f 操作符检测文件的存在性;

n  使用 -d 或者 !-d 操作符检测目录的存在性;

n  使用 -e 或者 !-e 操作符检测文件、目录或者符号连接的存在性;

n  使用 -x 或者 !-x 检测文件是否可执行。

 

正则表达式部分可以放在括号内,以便在以后的使用中可以通过变量$1 $9来访问。例如:

 

if ($http_user_agent ~ MSIE) {

  rewrite  ^(.*)$  /msie/$1  break;

}

 

if ($http_cookie ~* "id=([^;] +)(?:;|$)" ) {

  set  $id  $1;

}

 

if ($request_method = POST ) {

  return 405;

}

 

if ($slow) {

  limit_rate  10k;

}

 

if ($invalid_referer) {

  return   403;

}

 

if ($args ~ post=140){

  rewrite ^ http://example.com/ permanent;

}

 

 

        在条件判断中可以使用的一些全局变量:$args$content_length$content_type$document_root$document_uri$host$http_user_agent$http_cookie$limit_rate$request_body_file$request_method$remote_addr$remote_port$remote_user$request_filename$request_uri$query_string$scheme$server_protocol$server_addr$server_name$server_port$uri

 

指令名称:return

    能: 该指令会结束执行规则,并且会为客户端返回状态码。可使用的代码值:204, 400, 402-406, 408, 410, 411, 413, 416 500-504,此外,非标准的代码444将会关闭连接而不会发送任何头

    : return code

默 认 值: none

使用环境: server, location, if

 

指令名称:rewrite

    : rewrite regex replacement flag

默 认 值: none

使用环境: server, location, if

    能:该指令会按照相关的regex正则表达式和replacement替换字符串改变URIrewrite指令会按照自己在配置文件中出现的顺序执行,这一点要格外注意。

如果replacement替代字符串由http://开始,那么客户端将会被重定向redirect,任何其它后面的rewrite指令都被终结。

 

标志flag用于结束rewrite指令,它的可取值有:

 

l         last - 在搜索到相应的URIlocation之后完成rewrite指令;

l         break - 完成 rewrite指令处理

l         redirect - 返回302临时重定向,如果replacement替换部分是由http://开始,它将被应用。

l         permanent - 返回30代码永久重定向

 

注意,如果重定向是相当的,即没有主机部分,那么当使用重定向时,Nginx使用"Host"头的顺序为:如果有匹配server_name指令指定的主机名,那么则使用它;如果没有,那么将会使用第一个server_name设置的值;如果仍然没有,那么本地主机名会被使用。如果想让Nginx总是使用"Host"头,那么可以在server_name指令中使用"*"(但是这么做会有限制)。例如:

 

rewrite ^(/download/.*)/media/(.*)..*$  $1/mp3/$2.mp3  last;

rewrite ^(/download/.*)/audio/(.*)..*$  $1/mp3/$2.ra   last;

return  403;

   

    如果我们将这些指令放置在/download/中,那么有必要将标志"last" 替换为 "break",否则Nginx在经过10 循环后将会返回500错误:

 

location /download/ {

  rewrite ^(/download/.*)/media/(.*)..*$  $1/mp3/$2.mp3  break;

  rewrite ^(/download/.*)/audio/(.*)..*$  $1/mp3/$2.ra   break;

  return  403;

}

 

   

    如果在replacement替换部分包含参数,那么其余的参数添加在后面,另外,为了避免参数部分再被附加,可以在参数部分最后一个字符后再放置一个。例如:

 

rewrite  ^/users/(.*)$  /show?user=$1?  last;

  

    注意使用大括号( { } ),由于它们可以同时使用在正则表达式和区段(就是httpserverlocationif)控制中,为了避免歧义、冲突,因此在正则表达式中使用大括号( { } )那么将它们使用双引号或者单引号来括起。例如:

 

    我们将/photos/123456  重定向该URL

 

/path/to/photos/12/1234/123456.png

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/27043155/viewspace-734211/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/27043155/viewspace-734211/

最后

以上就是彩色狗为你收集整理的Nginx 重写URI重写URI的全部内容,希望文章能够帮你解决Nginx 重写URI重写URI所遇到的程序开发问题。

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

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

评论列表共有 0 条评论

立即
投稿
返回
顶部