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. ERP仓库管理的操作与设计--开源软件诞生20

    赤龙ERP库房管理讲解--第20篇 用日志记录"开源软件"的诞生 [点亮星标]----祈盼着一个鼓励 博主开源地址: 码云:https://gitee.com/redragon/r ...

  2. ServletRequest使用介绍

    ServletRequest: 定义将客户端请求信息提供给某个 servlet 的对象:servlet 容器创建 ServletRequest 对象,并将该对象作为参数传递给该servlet的serv ...

  3. 10 个 Python 初学者必知编码小技巧

    技巧 #1 字符串翻转 a = "codementor">>> print "Reverse is",a[::-1]翻转后的结果为 rotne ...

  4. centos7下PHP安装gd扩展

    第一步: 安装需要用到的库 yum -y install libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel 第二步: ...

  5. WSL2 + Docker + IDEA 开发到发布一步到位

    摘要:本文主要介绍了如何用WSL2.Docker.IDEA将Java应用从开发到发布一步到位. 上次介绍了如何在Windows(WSL2) Linux子系统中搭建搭建Docker环境,这次将利用上次搭 ...

  6. 通过express快速搭建一个node服务

    Node.js 是一个基于Chrome JavaScript 运行时建立的一个平台.可以理解为是运行在服务端的 JavaScript.如果你是一个前端程序员,不太擅长像PHP.Python或Ruby等 ...

  7. Tensorflow学习笔记No.9

    模型的保存与恢复 介绍一些常见的模型保存与恢复方法,以及如何使用回调函数保存模型. 1.保存完整模型 model.save()方法可以保存完整的模型,包括模型的架构.模型的权重以及优化器. model ...

  8. Kubernetes Controller详解

    运行容器化应用是Kubernetes最重要的核心功能.为满足不同的业务需要,Kubernetes提供了多种Controller,主要包括Deployment.DaemonSet.Job.CronJob ...

  9. 4G DTU无线数据透明传输终端

    4G DTU是基于4G网络的远程无线数据透明传输终端,是一种物联网无线数据传输设备,使用公用运营商的4G网络为用户提供无线远距离数据传输功能,使用工业级32位的高性能通信处理器和工业级无线模块,以嵌入 ...

  10. 初步配置基于Struts的maven的Web项目demo

    1.创建mavenweb项目 eclipse | Idea 中创建maven项目,具体步骤PASS. 2.导入Struts2核心架包 Idea中在maven项目上,选择ADD FRAMEWORK ec ...