Nginx实现URL重写

本文利用Nginx实现URL重写,本文使用Nginx与静态页面配合重写URL。html

1.准备工做。

结合本文场景,须要安装Nginx。nginx

1.1 关于Linux系统安装Nginx能够参考个人文章---(传送门)。正则表达式

2.什么是URL重写?

URL重写是指将一个URL请求从新写成网站能够处理的另外一个URL的过程。这样说可能不是很好理解,举个例子来讲明一下,在开发中可能常常遇到这样的需求,好比经过浏览器请求的http://localhost:8080/getUser?id=1,可是须要经过SEO优化等等缘由,须要把请求的地址重写为http://localhost:8080/getUser/1这样的URL,从而符合需求或者更好的被网站阅读。浏览器

当遇到这种请求的时候,就须要使用到UrlRewrite重写或者使用一些网关路由,如SpringCloud的Gateway,Zuul,又或者是Nginx来实现这个功能。bash

本文介绍Nginx实现URL重写。cookie

3.使用介绍

在Nginx中使用URL重写须要使用到一个指令-----rewrite,其语法以下:学习

rewrite regex replacement [flag]; 
复制代码
  • regex :可使用正则或者字符串来表示相匹配的地址。
  • replacement:能够表示重定向的地址。
  • flag :flag标志的做用是用于控制当匹配到对应的rewrite规则后是否继续检查后续的rewrite规则。

flag值为以下四种,分别是:测试

  • last:中止处理当前的rewrite指令集,然后经过重写后的规则从新发起请求,浏览器地址栏URL地址不变。
  • break:和break指令同样,都是中止处理当前上下文中的其余重写模块指令。
  • redirect:若是替换字符串不以“ http://”,“ https://”或“ $scheme” 开头,返回带有302代码的临时重定向,浏览器地址会显示跳转后的URL地址。
  • permanent:返回301代码的永久重定向,浏览器地址栏会显示跳转后的URL地址。

例如:优化

server {
    ...
    rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 last;
    rewrite ^(/download/.*)/audio/(.*)\..*$ $1/mp3/$2.ra  last;
    return  403;
    ...
}
复制代码

另外还能够根据if来判断,指令以下:网站

if (condition) { ... }
复制代码

其中condition是条件,若是为true,则执行大括号中的内容:

  • 使用“ =”和“ !=”运算符比较变量和字符串;
  • 使用“ ~”(对于区分大小写的匹配)和“ ~”(对于不区分大小写的匹配)运算符,将变量与正则表达式进行匹配。正则表达式能够包含可供之后在$1.. $9变量中重用的捕获。负操做符“ !~”和“ !~”也可用。若是正则表达式包含“ }”或“ ;”字符,则整个表达式应包含在单引号或双引号中。
  • 使用“ -f”和“ !-f”运算符检查文件是否存在;
  • 使用“ -d”和“ !-d”运算符检查目录是否存在;
  • 使用“ -e”和“ !-e”运算符检查文件,目录或符号连接是否存在;
  • 使用“ -x”和“ !-x”运算符检查可执行文件。

例如:

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;
}
复制代码

4.Nginx配置

本文例子只是将请求跳转到本人的博客首页http://www.dalaoyang.cn/,配置以下:

worker_processes  1;

events {
    worker_connections  1024;
}

http {

   server {
       listen       10000;
       server_name  localhost;

       #若是host不是dalaoyang.cn,则301到www.dalaoyang.cn中
       if ( $host != "dalaoyang.cn" ){
         rewrite ^/(.*)$ https://www.dalaoyang.cn/$1 last;
       }

    }

}
复制代码

5.测试

测试就比较简单了,在浏览器访问http://localhost:10000/about,会自动跳转到https://www.dalaoyang.cn/about,如图所示。

6.总结

大部份内容都是参考自Nginx官网来学习的,官网的例子都很详细。

参考自Nginx官网ngx_http_rewrite_module模块官方API---传送门

相关文章
相关标签/搜索