本文利用 Nginx 实现 URL 重写, 本文使用 Nginx 与静态页面配合重写 URL.
1. 准备工作.
结合本文场景, 需要安装 Nginx.
1.1 关于 Linux 系统安装 Nginx 可以参考我的文章 ---(传送门 https://www.dalaoyang.cn/article/55 ).
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://" 或 https://xn--ivg401x/ "$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--- 传送门.
来源: http://www.bubuko.com/infodetail-2919745.html