nginx URL重写(rewrite)配置

URL重写有利于网站首选域的确定,对于同一资源页面多条路径的301重定向有助于URL权重的集中

1.Nginx URL重写(rewrite)介绍

和apache等web服务软件一样,rewrite的组要功能是实现RUL地址的重定向。
Nginx的rewrite功能需要PCRE软件的支持,即通过perl兼容正则表达式语句进行规则匹配的。
默认参数编译nginx就会支持rewrite的模块,但是也必须要PCRE的支持

2.rewrite语法格式及参数语法:

rewrite是实现URL重写的关键指令,根据regex (正则表达式)部分内容,
重定向到replacement,结尾是flag标记。


rewrite            [flag];
关键字      正则        替代内容         flag标记

关键字:其中关键字error_log不能改变
正则:perl兼容正则表达式语句进行规则匹配
替代内容:将正则匹配的内容替换成replacement
flag标记:rewrite支持的flag标记

rewrite参数的标签段位置:
server,location,if

flag标记说明:
last  #本条规则匹配完成后,继续向下匹配新的location URI规则
break  #本条规则匹配完成即终止,不再匹配后面的任何规则
redirect  #返回302临时重定向,浏览器地址会显示跳转后的URL地址
permanent  #返回301永久重定向,浏览器地址栏会显示跳转后的URL地址

2.1nginx rewrite变量,常用于匹配HTTP请求头信息、浏览器主机名、URL

HTTP headers:HTTP_USER_AGENT, HTTP_REFERER, HTTP_COOKIE, HTTP_HOST, HTTP_ACCEPT;
connection & request: REMOTE_ADDR, QUERY_STRING;
server internals: DOCUMENT_ROOT, SERVER_PORT, SERVER_PROTOCOL;
system stuff: TIME_YEAR, TIME_MON, TIME_DAY。
详解如下:
HTTP_USER_AGENT      用户使用的代理,例如浏览器;
HTTP_REFERER         告知服务器,从哪个页面来访问的;
HTTP_COOKIE          客户端缓存,主要用于存储用户名和密码等信息;
HTTP_HOST            匹配服务器ServerName域名;
HTTP_ACCEPT          客户端的浏览器支持的MIME类型;      
REMOTE_ADDR          客户端的IP地址
QUERY_STRING         URL中访问的字符串;
DOCUMENT_ROOT        服务器发布目录;
SERVER_PORT          服务器端口;
SERVER_PROTOCOL      服务器端协议;
TIME_YEAR            年;
TIME_MON             月;
TIME_DAY              日;

3.例子

3.0较难场景

第一种:
将uri中的所有空格替换为"_",连续的空格替换为一个"_"放到proxy_pass之前,
切记, 下述表达式中第一个括号后有空格
rewrite '^(\S+) +(\S+)(.*)' $1_$2$3 last;

3.1demo01

rewrite ^/(.*) http://www.zy.com/$1 permanent;
说明:                                        
rewrite为固定关键字,表示开始进行rewrite匹配规则。
regex部分是 ^/(.*) ,这是一个正则表达式,匹配完整的域名和后面的路径地址。
replacement部分是http://www.zy.com/$1。其中$1是取自regex部分()里的内容,匹配成功后跳转到的URL。
flag部分 permanent表示永久301重定向标记,即跳转到新的http://www.zy.com/$1 地址上。

3.2demo02

vi编辑虚拟主机配置文件

vi conf/vhost/www.abc.com.conf

修改文件内容方法1

server {
        listen 80;
        server_name abc.com;
        rewrite ^/(.*) http://www.abc.com/$1 permanent;
}
server {
        listen 80;
        server_name www.abc.com;
        location / {
                root /data/www/www;
                index index.html index.htm;
        }
        error_log    logs/error_www.abc.com.log error;
        access_log    logs/access_www.abc.com.log    main;
}

修改文件内容方法2

server {
        listen 80;
        server_name abc.com www.abc.com;
        if ( $host != 'www.abc.com'  ) {
                rewrite ^/(.*) http://www.abc.com/$1 permanent;
        }
        location / {
                root /data/www/www;
                index index.html index.htm;
        }
        error_log    logs/error_www.abc.com.log error;
        access_log    logs/access_www.abc.com.log    main;
}

3.3将zy.com跳转至www.zy.com

if ($host = zy.com' ) {
     #其中$1是取自regex部分()里的内容,匹配成功后跳转到的URL。
     rewrite ^/(.*)$  http://www.zy.com/$1  permanent;
}

3.4访问www.zy.com跳转www.test.com/index01.html

rewrite   ^/$  http://www.test.com/index01.html  permanent;

3.5访问/zy/test01/跳转至/newindex.html,浏览器地址不变

rewrite   ^/zy/test01/$     /newindex.html     last;

3.6多域名跳转到www.zy.com

if ($host != ‘www.jfedu.net’ ) {
    rewrite ^/(.*)$  http://www.zy.com/$1  permanent;
}

3.7访问文件和目录不存在跳转至index.php

if ( ! -e $request_filename ) {
    rewrite  ^/(.*)$  /index.php  last;
}

3.8目录对换 /xxxx/123456 ====> /xxxx?id=123456

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

3.9判断浏览器User Agent跳转

if( $http_user_agent  ~ MSIE) {
    rewrite ^(.*)$ /ie/$1 break;
}

3.10 禁止访问以.sh,.flv,.mp3为文件后缀名的文件

location ~ .*\.(sh|flv|mp3)${
       return 403;
} 

3.11 将移动用户访问跳转至移动端

if ( $http_user_agent ~* "(Android)|(iPhone)|(Mobile)|(WAP)|(UCWEB)" ){
      rewrite ^/$    http://m.jfedu.net/    permanent;
}

3.12 访问/10690/zy/123跳转至/index.php?tid/10690/items=123,[0-9]表示任意一个数字,+表示多个,(.+)表示任何多个字符__

rewrite   ^/([0-9]+)/zy/(.+)$     /index.php?tid/$1/items=$2     last;

3.13匹配URL访问字符串跳转

if ($args ~* tid=13){
    return 404;
}

4.rewrite 企业应用场景

>> 可以调整用户浏览的URL,看起来更规范,合乎开发及产品人员的需求。

>> 为了让搜索引擎搜录网站内容及用户体验更好,企业会将动态URL地址伪装成静态地址提供服务。

>> 网址换新域名后,让旧的访问跳转到新的域名上。例如,访问京东的360buy.com会跳转到jd.com

>> 根据特殊变量、目录、客户端的信息进行URL调整等

你可能感兴趣的:(nginx URL重写(rewrite)配置)