VPS测评 VPS推荐 VPS优惠
Linux运维

Nginx Rewrite实现URL重写和http跳转https

Rewrite是Nginx服务器的重要功能之一,用于实现URL的重写。URL的重写是非常有用的功能,比如它可以在我们改变网站结构之后,不需要客户端修改原来的书签,也无需其他网站修改我们的链接,就可以设置为访问,另外还可以在一定程 度上提高网站的安全性。这个功能是由ngx_http_rewrite_module提供的,依赖于PCRE库。

官方文档

https://nginx.org/en/docs/http/ngx_http_rewrite_module.html#if


常见指令

if 指令

用于条件匹配判断,并根据条件判断结果选择不同的Nginx配置,可以配置在server或location块中。if指令仅能做单次判断,不支持使用if else或者if elif这样的多重判断,用法如下:

if (条件匹配) {
action
}

使用正则表达式对变量进行匹配,匹配成功时为true,反之为false,变量与表达式之间使用以下符号链接:

=                #比较是否相等
!=               #比较是否不相等
~                #正则表达式匹配,区分大小写
!~               #正则表达式不匹配,区分大小写
~*               #正则表达式匹配,不区分大小写  
!~*              #正则表达式不匹配,不区分大小写
-f !-f           #判断请求的文件是否存在/不存在
-d !-d           #判断请求的目录是否存在/不存在
-x !-x           #判断是否可执行/不可执行
-e !-e           #判断请求的文件/目录是否存在/不存在
注:空字符串和0返回false,其他返回true

set指令

指定key并给其定义一个变量,变量可以调用Nginx内置变量赋值给key。定义格式为set $keyvalue,value可以是text, variables和两者的组合。

用法:

location / {
root /var/www/html;
index index.html;
default_type text/html;
set $name xiaoqinwa;
set $my_port $server_port;
}

break指令

用于中断当前相同作用域(location)中的其他Nginx配置。

与该指令处于同一作用域的Nginx配置中,位于它前面的配置生效,位于后面的ngx_http_rewrite_module 模块中指令就不再执行,其它指令还会执行。

return指令

return用于完成对请求的处理,并直接向客户端返回响应状态码,比如:可以指定重定向URL(对于特殊重定向状态码,301/302等) 或者是指定提示文本内容(对于特殊状态码403/500等),处于此指令后的所有配置都将不被执行,return可以在server、if 和 location块进行配置。

语法:

#返回给客户端指定的HTTP状态码
return code;
#返回给客户端的状态码及响应报文的实体内容,可以调用变量,其中text如果有空格,需要用单或双引号
return code [text];
#返回给客户端的URL地址
return code URL;

返回自定义状态码666

   location / {
    default_type text/html;
    return 666 "你来啦";
  }

临时跳转到百度

    location / {
    default_type text/html;
    return 302 https://baidu.com;
  }

rewrite_log 指令

设置是否开启记录rewrite模块日志记录到 error_log日志文件当中,可以配置在http、server、location 或 if 中。需要日志级别为notice。

rewrite_log on;

rewrite指令

通过正则表达式的匹配来改变URI,可以同时存在一个或多个rewrite指令,按照顺序依次对URI进行匹配。针对用户请求的URL或者是URI做具体处理。可以配置在 server、location、if。

语法:

rewrite regex replacement [flag];
  • rewrite将用户请求的URI基于regex所描述的模式进行检查,匹配到时将其替换为表达式指定的新的URI
  • 如果在同一级配置块中存在多个rewrite规则,那么会自上而下逐个检查。被某条件规则替换完成后,会进行新一轮的替换检查,隐含有循环机制,但不超过10次,如果超过,提示500响应码。[flag]所表示的标志位用于控制此循环机制。
  • 如果替换后的URL是以http://或https://开头,则替换结果会直接以重定向返回给客户端, 即临时重定向302。

正则表达式格式

.         #匹配除换行符以外的任意字符
\w #匹配字母或数字或下划线或汉字
\s #匹配任意的空白符
\d #匹配数字
\b #匹配单词的开始或结束
^ #匹配字符串的开始
$ #匹配字符串的结束
* #匹配重复零次或更多次
+ #匹配重复一次或更多次
? #匹配重复零次或一次
(n) #匹配重复n次
{n,} #匹配重复n次或更多次
{n,m} #匹配重复n到m次
*? #匹配重复任意次,但尽可能少重复
+? #匹配重复1次或更多次,但尽可能少重复
?? #匹配重复0次或1次,但尽可能少重复
{n,m}? #匹配重复n到m次,但尽可能少重复
{n,}? #匹配重复n次以上,但尽可能少重复
\W #匹配任意不是字母,数字,下划线,汉字的字符
\S #匹配任意不是空白符的字符
\D #匹配任意非数字的字符
\B #匹配不是单词开头或结束的位置
[^x] #匹配除了 x 以外的任意字符
[^frog] #匹配除了 frog 这几个字母以外的任意字符

rewrite flag 使用介绍

rewrite 有四种不同的flag,分别是redirect(临时重定向302)、permanent(永久重定向301)、break和last。

其中前两种是跳转型的flag,后两种是代理型。跳转型指由客户端浏览器重新对新地址进行请求,实际发起了两次请求。代理型是在WEB服务器内部实现跳转,实际只发起了一次请求。

  • redirect临时重定向,重写完成后以临时重定向方式直接返回重写后生成的新URL给客户端,由客户端重新发起请求; 使用相对路径,或者http://或https://开头,状态码:302
  • permanent重写完成后以永久重定向方式直接返回重写后生成的新URL给客户端,由客户端重新发起请求,状态码:301
  • break重写完成后,停止对当前URL在当前location中后续的其它重写操作,而后直接跳转至重写规则配置块之后 的其它配置结束循环。建议在location中使用。适用于一个URL一次重写。
  • last重写完成后,停止对当前URI在当前location中后续的其它重写操作,而后对新的URL启动新一轮重写检查, 不建议在location中使用。适用于一个URL多次重写。超过十次以及URL重写后会返回错误。

临时重定向(302)与永久重定向(301)最大的本质区别在于,永久重定向会缓存DNS解析记录, 浏览器中有 from disk cache 信息。域名临时重定向,告诉浏览器域名不是固定重定向到当前目标域名,后期可能随时会更改,因此浏览器不会缓存当前域名的解析记录。


rewrite案例: 自动跳转 https

有时候我们的网站虽然配置了SSL证书,但是仍然有一些用户会通过http协议来访问网站。由于http协议是不加密的,这样通信就会很不安全,所以我们可以把客户端的http请求重写到https来实现更加安全的连接。


add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
if ( $scheme = http ) {
rewrite ^/(.*)$ https://frogvps.com/$1 redirect;
}

这里的if条件判断是必须的,不然很容易陷入不停跳转的死循环。上面添加了头部信息,作用是在某段时间内第二次以http访问时浏览器就可以直接跳转到https,而不是反复的询问服务端,节约了服务器资源。


rewrite 案例: 判断文件是否存在

当用户访问到公司网站的时输入了一个错误的URL,可以将用户重定向至官网首页。

实现302跳转

location / {
root /var/www/html;
index index.html;
if (!-e $request_filename) {
rewrite .* http://www.magedu.org/index.html;
}
}

实现内部跳转

location / {
root /var/www/html;
index index.html;
if (!-e $request_filename) {
rewrite .* /index.html;
}
}

rewrite案例:更换目录访问方式,目录转换为对象存储形式

要求:

/20200106/static ->/static?id=20200106

/20200123/image ->/image?id=20200123

rewrite ^/(\d+)/(.+) /$2?id=$l last;
未经允许不得转载:青蛙主机 » Nginx Rewrite实现URL重写和http跳转https

VPS相关常用工具

PING测试工具自用毛子接码站