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

1.准备工作。

结合本文场景,需要安装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来实现这个功能。

本文介绍Nginx实现URL重写。

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---传送门

Nginx实现URL重写的更多相关文章

  1. nginx的URL重写应用实例

    1,NGINx的URL重写 NGINX 的URL重写模块用的比较多,主要使用的命令有if rewrite set break 2 if命令 语法如下"" 语法:if(conditi ...

  2. 4.Nginx的URL重写应用

    Nginx的URL重写应用 nginx的URL重写模块是用得比较多的模块之一,所以我们需要好好地掌握运用.常用的URL重写模块命令有if,rewrite,set,break等. if命令 if用于判断 ...

  3. nginx配置url重写

    url重写是指通过配置conf文件,以让网站的url中达到某种状态时则定向/跳转到某个规则,比如常见的伪静态.301重定向.浏览器定向等 rewrite 语法 在配置文件的server块中写,如: s ...

  4. nginx的url重写

    1.1 简介 url重写由ngx_http_rewrite_module模块提供,默认会安装,但该模块功能的实现需要pcre.URL重写技术不仅要求掌握几个指令的语法.熟悉简单的正则表达式,还需要尽量 ...

  5. Nginx之URL重写(rewrite)配置

    Nginx URL重写(rewrite)配置及信息详解1)if判断指令 语法为if(condition){…}     #对给定的条件condition进行判断.如果为真,大括号内的rewrite指令 ...

  6. nginx的url重写[rewrite规则和参考]

    本日志内容来自互联网和平日使用经验,整理一下方便日后参考. Nginx Rewrite 相关指令有 if.rewrite.set.return 等. if 的语法 应用于 server 和 locat ...

  7. lnmp配置支持thinkphp和nginx路由url重写

    ThinkPHP3.2.3项目放到lnmp环境之后只能打开首页,或者通过传参方式打开控制器,否则就一直显示404页面.搞了一上午,终于解决了 step1: 修改php.ini cgi.fix_path ...

  8. nginx-url重写

    location /game_web{ if (!-e $request_filename){//请求不是文件或者目录 rewrite ^/game_web/(\/init/$ last; break ...

  9. Nginx 反向代理、负载均衡、页面缓存、URL重写及读写分离详解

    转载:http://freeloda.blog.51cto.com/2033581/1288553 大纲 一.前言 二.环境准备 三.安装与配置Nginx 四.Nginx之反向代理 五.Nginx之负 ...

随机推荐

  1. Linux基本命令总结(四)

    接上篇: 16,locate 让使用者可以很快速的搜寻档案系统内是否有指定的档案.其方法是先建立一个包括系统内所有档案名称及路径的数据库,之后当寻找时就只需查询这个数据库,而不必实际深入档案系统之中了 ...

  2. 微信小程序之 3d轮播(swiper来实现)

    以前写过一篇3d轮播,就是这篇,使用的方法比较笨拙,而且代码不简洁.这次发现swiper也能实现同样的效果.故记录一下. 先看看效果: wxml: <swiper previous-margin ...

  3. PowerDesigner生成pdm(适用Mysql)

    废话不多说,直接开始: 1.首先安装所需要的驱动以及应用程序 ①和② 是 Mysql数据库连接驱动 ,根据PowerDesigner的位数来选择下载 下载地址:https://dev.mysql.co ...

  4. CMDB服务器管理系统【s5day92】:服务器管理回顾

    一.服务器管理回顾 1.requests 发送: requests.post(url='',data=,json=) requests.get() Django接受: request.POST, co ...

  5. SpringBoot系列: 如何优雅停止服务

    ============================背景============================在系统生命周期中, 免不了要做升级部署, 对于关键服务, 我们应该能做到不停服务完成 ...

  6. mysql MHA架构搭建过程

    [环境介绍] 系统环境:Red Hat Enterprise Linux 7 + 5.7.18 + MHA version 0.57 系统 IP 主机名 备注 版本 xx系统 192.168.142. ...

  7. fetch 的控制器和观察者

    因为受 cancelable promise 的拖延,fetch 一直没有传统的 XHR 所拥有的 abort() 和 onprogress 功能,去年年底 cancelable promise 草案 ...

  8. Shpinx在PHPCMS里的使用及配置

    现在可以用最新版的Sphinx版本 网址:http://sphinxsearch.com/downloads/release/ 我使用rpm方式: 下载RHEL/CentOS 6.x x86_64 R ...

  9. 「WC2018」通道

    没有代码能力... LOJ #2339 Luogu P4220 UOJ #347 题意 给定三棵树$ T1,T2,T3$,求一个点对$ (x,y)$使得$ T1.dist(x,y)+T2.dist(x ...

  10. main 及Scanner

    通过main方法的args数组可以从控制台获取一组字符串数据. 1.Scanner类用于扫描从控制台输入的数据,可以接收字符串和基本数据类型的数据. 2.Scanner类位于java.util.Sca ...