URL Rewrite是网站建设中经常用到的一项技巧,通过 rewrite 我们能够屏蔽服务器运行态的信息,包括服务的程序、参数等等,给用户呈现美化后的URL,同时对搜索引擎更加友好,方便我们网站的推广。

rewrite 功能介绍

URL是互联网上指定信息的唯一标志,URL Rewrite 就是常说的地址重写,我们一般常说的地址重写主要是针对 HTTP 或 HTTPS 协议,具体的场景有下面几种。

  • 美化URL。不管使用哪种后台语言,多多少少会有一些能够暴露技术特性的后缀,例如 .php.do 等等。URL重写后,去掉了这些对于普通用户难于理解的后缀,也有利于网站后台的安全。
  • 提高安全性。可以对一个域名下的所有服务进行重写,只开放对外的服务。对于不开放服务的访问,重定向到404或者500页面,避免被人暴力猜解。
  • 有利于搜索引擎收录。有些后台服务的功能很强大,但是为了按照业务拆分,我们可以设计一些后台并不存在的URL,利于搜索引擎的收录和业务的开展。
  • 方便URL的重用一记后台服务的调整。如果我们后台进行了版本升级或者地址变更,都可以通过URL Rewrite对外部用户屏蔽这些变化,极大的方便了网站的维护。

这些场景可以用下图来概括说明。

有的朋友会发出疑问,在PC时代,大家首先面对的就是网站的地址,但是2020已经快要步入5G时代,大多数人都是通过手机APP来访问互联网上的各种内容。根据 CNNIC 《第46次中国互联网络发展状况统计报告》显示我国网民使用手机上网的比例达99.2%,而使用台式机和笔记本上网的网民比例分别是37.3%和31.8%。使用手机上网,很多情况下我们都是扫描一个二维码或者点击分享的链接就能打开页面,而无需再记忆复杂的URL,那么是否可以说在5G时代,URL Rewrite 就不重要了呢?

实际上,网站服务除了被用户访问外,每天都会被搜索引擎、黑产分子不停的访问,在5G时代即便用户不需要手工输入URL来访问,合理利用URL Rewrite这项技术仍是每个网站开发人员、网站维护人员不可缺少的技能。

URL Rewrite的方法有很多,可以利用Apache、Nginx等中间件,也可以使用支持单入口的程序框架(例如PHP的Codeigniter)等,本文介绍如何使用Nginx来实现URL Rewrite的需求,毕竟Nginx近年来的发展势头那真是势不可挡。

nginx rewrite

Nginx提供了rewrite功能,结合正则表达式和标志位实现URL的重写与重定向,正则规则采用PCRE(PERL兼容的正则表达式语法规则)。

如果需要正则功能,在编译Nginx之前,需要编译安装PCRE库。

rewrite 规则只能放在server{},location{},if{}中,并且只能对域名后边除去传递的参数外的字符串起作用。。

rewrite 语法

rewrite 是实现URL重写的关键,根据正则表达式的内容,重新定向到replacement指定的URL,根据末尾的flag参数不同,决定后续的处理动作。

指令语法 rewrite regex replacement [flag]
默认值 none
应用位置 server、location、if

简单的示例:

# URL实现伪静态,将动态参数变为URL中的字符串
rewrite ^/users/(.*)$ /show.php?user=$1? last; # 实现不同语言网站的跳转
rewrite ^/cn/(.*)$ /cn/$1 break;
rewrite ^/jp/(.*)$ /jp/$1 break; # 将所有的请求都定向到 baidu.com
rewrite ^/(.*) http://www.baidu.com/ permanent;

在Nginx的配置中,优先执行 server 块中的 rewrite 指令,然后再执行 location 块中的 rewrite 指令。最后再执行选定的 location 中的 rewrite 指令。

flag标记

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

在flag标记中,lastbreak 实现功能类似,使用 alias 指令时必须用 last 标记,使用 proxy_pass 指令时要使用 break 标记。last 标记在本条 rewrite 规则执行完毕后,会对其所在的 server{…} 标签重新发起请求,而 break 标记则会在本条规则匹配完成后,终止匹配,不再匹配后面的规则。

实战案例

本文提供了一个基于 docker 的演示案例,将上文的场景一一演示出来。通过访问 我的Github 可以获得全部的 docker 编排文件及代码。

不太熟悉 Docker 的同学可以参考 使用 Docker 快速搭建LNMP开发环境,让你在安装了 Docker 的情况下,使用一条命令就快速搭建LNMP开发环境。还要了解更多 Docker 的内容,可以查看 Docker 系列文章

主要的语法如下

rewrite ^/login$ /login.php last;
rewrite ^/register$ /register.php last;
rewrite ^/search$ /search.php last;
rewrite ^/discount/student$ /discount.php?u=d last;
rewrite ^/discount/teacher$ /discount.php?u=t last;

Nginx Rewrite 还有更多强大的功能,等待大家去探索,欢迎关注我的公众号与我进行交流探讨。

参考资料

  1. IETF RFC 1630
  2. Ngx_http_rewrite_module
  3. nginx中try_files
  4. Nginx rewrite or internal redirection cycle while internally redirecting
  5. Nginx rewrite

5G时代,URL Rewrite 还吃香吗的更多相关文章

  1. 使用微软 URL Rewrite Module 开启IIS伪静态

    原文 使用微软 URL Rewrite Module 开启IIS伪静态 在IIS5和IIS6时代,我们使用URL REWRITING可实现URL重写,使得WEB程序实现伪静态,但默认情况下只能实现.A ...

  2. nginx和apache下的url rewrite

    将服务器上面的数据同步到本地之后,发现打开首页显示不正常,本地服务器是apache,经过打开url rewrite之后本地首页正常显示. 原因是phpwind本身支持了url rewrite的功能,但 ...

  3. IIS使用 URL Rewrite Module 2.0组件 设置伪静态的方法

    简体中文版WIn10无法安装,需要改注册表, HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\InetStp  MajorVersion 项,这个也是 dword 值 10 ...

  4. 在ASP.NET MVC中使用IIS级别的URL Rewrite

    原文 在ASP.NET MVC中使用IIS级别的URL Rewrite 大约一年半前,我在博客上写过一系列关于URL Rewrite的文章(2.3.4),把ASP.NET平台上进行URL Rewrit ...

  5. Nginx下支持ThinkPHP的Pathinfo和URl Rewrite模式

    下面介绍如何使Nginx支持ThinkPHP的Pathinfo和URL Rewrite模式. 1.ThinkPHP给出了ThinkPHP的官方解决方案,如下: 打开Nginx的配置文件 /etc/ng ...

  6. 5G 时代,可能是什么样呢?

        (摄于上海陆家嘴) 众所周知,5g时代即将到来,其相关的区块链技术也将在更多的领域以及方面发挥越来越多的作用. 与新模式与新领域这种软性变化不同,新技术的产生,有着足够的想象空间.仅从内容创作 ...

  7. 天府大讲堂:5G时代的物联网发展趋势与产业变革

    摘要:国家973物联网首席科学家,中科院上海微系统与信息技术研究所副所长,无锡物联网产业研究院院长刘海涛教授讲授的5G时代的物联网发展趋势与产业变革意义深刻.作者根据天府大讲堂听讲内容加工整理所得,旨 ...

  8. 5G时代的到来,会给生活带来什么改变?

    本文首发于:风云社区. 据百度百科介绍,5G网络是第五代移动通信网络,其峰值理论传输速度可达每秒数十Gb,比4G网络的传输速度快数百倍.举例来说,整部超高画质电影可在1秒之内下载完成.   5G网络已 ...

  9. (Nginx) URL REWRITE

    URL重写的基础介绍 把URI地址用作参数传递:URL REWRITE 最简单的是基于各种WEB服务器中的URL重写转向(Rewrite)模块的URL转换: 这样几乎可以不修改程序的实现将 news. ...

随机推荐

  1. C# 8: 默认接口方法

    翻译自 John Demetriou 2018年8月4日 的文章 <C# 8: Default Interface Methods>[1],补充了一些内容 C# 8 之前 今天我们来聊一聊 ...

  2. 如何在windows Server 2008虚拟机上安装SQLServer2008数据库

    一.环境准备 1.cn_windows_server_2008_r2_standard_enterprise_datacenter_web_x64_dvd_x15-50360.iso 2.NDP452 ...

  3. python自测100题

    如果你在寻找python工作,那你的面试可能会涉及Python相关的问题. 通过对网络资料的收集整理,本文列出了100道python的面试题以及答案,你可以根据需求阅读测试.如果你看了还是不懂可以加我 ...

  4. DEM轨迹后处理

    更推荐的方法:https://www.cnblogs.com/Jay-CFD/p/12195294.html 2020.6.16更新 方法一:直接在paraview中显示 首先在输出颗粒信息的时候保存 ...

  5. 4g工业路由器的覆盖范围分析

    4G工业路由器通常覆盖范围在60-80米之间,而影响4G工业路由器的覆盖范围有以下几个因素. 影响4g工业路由器覆盖范围的因素一:环境 空旷的环境下4g工业路由器的信号覆盖范围必然更加广阔,如果传输环 ...

  6. python使用pandas进行数据处理

    pandas数据处理 关注公众号"轻松学编程"了解更多. 以下命令都是在浏览器中输入. cmd命令窗口输入:jupyter notebook 打开浏览器输入网址http://loc ...

  7. 《Clojure编程》笔记 第1章 进入Clojure仙境

    目录 背景简述 第1章 进入Clojure仙境 1.1 基础概念 1.2 常用的一些符号 背景简述 本人是一个自学一年Java的小菜鸡,理论上跟大多数新手的水平差不多,但我入职的新公司是要求转Cloj ...

  8. P4683 [IOI2008] Type Printer 打印机

    题意描述 [IOI2008] Type Printer 打印机 几百年前的 IOI 的题目还是很好的呀. 给你一个 诡异的 打印机,它只能用已有的字符来打印,而且必须每一个都用到.(这岂不是活字印刷术 ...

  9. ZOJ 1004 Anagrams by Stack

    Anagrams by Stack 题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1004 题意:通过堆栈实现将一 ...

  10. ATcoder Grand Contest总结

    最前面: AT的题都很有思维难度,总结一下一些AT的常规操作 1.对于有操作的题目,如果正面推不行的话考虑倒推,将操作转化,寻找更好的性质 2.模型转化,看到某一种的计算的式子,需要考虑有没有更简化的 ...