0

0

nginx的url重写怎么用

WBOY

WBOY

发布时间:2023-05-19 12:37:06

|

1593人浏览过

|

来源于亿速云

转载

nginx之url重写

1.url重写模块(rewrite)

摘要这个模块允许使用正则表达式重写uri(需pcre库),并且可以根据相关变量重定向和选择不同的配置。如果这个指令在server字段中指定,那么将在被请求的location确定之前执行,如果在指令执行后所选择的location中有其他的重写规则,那么它们也被执行。如果在location中执行这个指令产生了新的uri,那么location又一次确定了新的uri。这样的循环可以最多执行10次,超过以后nginx将返回500错误。

break

语法:break 

默认值:none 

使用字段:server, location, if 

完成当前设置的规则,停止执行其他的重写指令。 

示例:

if ($slow) {
 limit_rate 10k;
 break;
}

if

语法:if (condition) { … } 

默认值:none 

使用字段:server, location 

注意:在使用if指令之前请查看if is evil page并且尽量考虑用try_files代替。 

判断一个条件,如果条件成立,则后面的大括号内的语句将执行,相关配置从上级继承。 

  • 可以在判断语句中指定下列值:

  • 一个变量的名称;不成立的值为:空字符传”“或者一些用“0”开始的字符串。

  • 一个使用=或者!=运算符的比较语句。

  • 使用符号~*和~模式匹配的正则表达式:

  • ~为区分大小写的匹配。

  • ~*不区分大小写的匹配(firefox匹配firefox)。

  • !~和!~*意为“不匹配的”。

  • 使用-f和!-f检查一个文件是否存在。

  • 使用-d和!-d检查一个目录是否存在。

  • 使用-e和!-e检查一个文件,目录或者软链接是否存在。

  • 使用-x和!-x检查一个文件是否为可执行文件。

正则表达式的一部分可以用圆括号,方便之后按照顺序用$1-$9来引用。 

示例配置:

if ($http_user_agent ~ msie) {
 rewrite ^(.*)$ /msie/$1 break;
}
                                                                            
if ($http_cookie ~* "id=([^;] +)(?:;|$)" ) {
 set $id $1;
}
                                                                            
if ($request_method = post ) {
 return 405;
}
                                                                            
if (!-f $request_filename) {
 break;
 proxy_pass http://127.0.0.1;
}
                                                                            
if ($slow) {
 limit_rate 10k;
}
                                                                            
if ($invalid_referer) {
 return  403;
}
                                                                            
if ($args ~ post=140){
 rewrite ^ http://example.com/ permanent;
}

内置变量$invalid_referer用指令valid_referers指定。

return

语法:return code 

默认值:none 

使用字段:server, location, if 

这个指令结束执行配置语句并为客户端返回状态代码,可以使用下列的值:204,400,402-406,408,410, 411, 413, 416与500-504。此外,非标准代码444将关闭连接并且不发送任何的头部。

rewrite

语法:rewrite regex replacement flag 

默认值:none 

使用字段:server, location, if 

按照相关的正则表达式与字符串修改uri,指令按照在配置文件中出现的顺序执行。 

可以在重写指令后面添加标记。 

如果替换的字符串以http://开头,请求将被重定向,并且不再执行多余的rewrite指令。 

尾部的标记(flag)可以是以下的值:

  • last - 完成重写指令,之后搜索相应的uri或location。

  • break - 完成重写指令。

  • redirect - 返回302临时重定向,如果替换字段用http://开头则被使用。

  • permanent - 返回301永久重定向。

注意如果一个重定向是相对的(没有主机名部分),nginx将在重定向的过程中使用匹配server_name指令的“host”头或者server_name指令指定的第一个名称,如果头不匹配或不存在,如果没有设置server_name,将使用本地主机名,如果你总是想让nginx使用“host”头,可以在server_name使用“*”通配符(查看http核心模块中的server_name)。例如:

rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 last;
rewrite ^(/download/.*)/audio/(.*)\..*$ $1/mp3/$2.ra  last;
return  403;

但是如果我们将其放入一个名为/download/的location中,则需要将last标记改为break,否则nginx将执行10次循环并返回500错误。

location /download/ {
 rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 break;
 rewrite ^(/download/.*)/audio/(.*)\..*$ $1/mp3/$2.ra  break;
 return  403;
}

如果替换字段中包含参数,那么其余的请求参数将附加到后面,为了防止附加,可以在最后一个字符后面跟一个问号:

麻雀企业网站管理系统3.0
麻雀企业网站管理系统3.0

主要功能:1、新闻信息:可分多类(内部新闻,外部新闻等)2、产品展示:可分多类(分类一,分类二等)3、网站公告:网站公告添加多数据显示。4、动态添加公司介绍,联系方式等并可以扩展。5、网站留言:前台发布留言后台验证后显示6、新闻信息和产品展示动态添加meta标签:keywords,description ,同时url重写htm页面更好的被搜索引擎收入。后台用户名密码admin

下载
rewrite ^/users/(.*)$ /show?user=$1? last;

注意:大括号({和}),可以同时用在正则表达式和配置块中,为了防止冲突,正则表达式使用大括号需要用双引号(或者单引号)。例如要重写以下的url:

/photos/123456

为:

/path/to/photos/12/1234/123456.png

则使用以下正则表达式(注意引号):

rewrite "/photos/([0-9] {2})([0-9] {2})([0-9] {2})" /path/to/photos/$1/$1$2/$1$2$3.png;

如果指定一个“?”在重写的结尾,nginx将丢弃请求中的参数,即变量$args,当使用$request_uri或$uri&$args时可以在rewrite结尾使用“?”以避免nginx处理两次参数串。 

在rewrite中使用$request_uri将www.example.com重写到example.com:

server {
  server_name www.example.com;
  rewrite ^ http://example.com$request_uri? permanent;
}

同样,重写只对路径进行操作,而不是参数,如果要重写一个带参数的url,可以使用以下代替:

if ($args ^~ post=100){
 rewrite ^ http://example.com/new-address.html? permanent;
}

注意$args变量不会被编译,与location过程中的uri不同(参考http核心模块中的location)。

rewrite_log

语法:rewrite_log on | off 

默认值:rewrite_log off 

使用字段:server, location, if 

变量:无 

启用时将在error log中记录notice 标记的重写日志。

set

语法:set variable value 

默认值:none 

使用字段:server, location, if 

指令设置一个变量并为其赋值,其值可以是文本,变量和它们的组合。 

你可以使用set定义一个新的变量,但是不能使用set设置$http_xxx头部变量的值。

uninitialized_variable_warn

语法:uninitialized_variable_warn on|off 

默认值:uninitialized_variable_warn on 

使用字段:http, server, location, if 

开启或关闭在未初始化变量中记录警告日志。 

事实上,rewrite指令在配置文件加载时已经编译到内部代码中,在解释器产生请求时使用。 

这个解释器是一个简单的堆栈虚拟机,如下列指令:

location /download/ {
 if ($forbidden) {
  return  403;
 }
 if ($slow) {
  limit_rate 10k;
 }
 rewrite ^/(download/.*)/media/(.*)\..*$ /$1/mp3/$2.mp3 break;

将被编译成以下顺序:

variable $forbidden
checking to zero
recovery 403
completion of entire code
variable $slow
checking to zero
checkings of regular excodession
copying "/"
copying $1
copying "/mp3/"
copying $2
copying ".mp3"
completion of regular excodession
completion of entire sequence

注意并没有关于limit_rate的代码,因为它没有提及ngx_http_rewrite_module模块,“if”块可以类似”location”指令在配置文件的相同部分同时存在。 

如果$slow为真,对应的if块将生效,在这个配置中limit_rate的值为10k。 

指令:

rewrite ^/(download/.*)/media/(.*)\..*$ /$1/mp3/$2.mp3 break;

如果我们将第一个斜杠括入圆括号,则可以减少执行顺序:

rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 break;

之后的顺序类似如下:

checking regular excodession
copying $1
copying "/mp3/"
copying $2
copying ".mp3"
completion of regular excodession
completion of entire code

2.简单案例

注,由于配置文件内容较多,为了让大家看着方便,我们备份一下配置文件,打开一个新的配置文件。

[root@nginx ~]# cd /etc/nginx/
[root@nginx nginx]# mv nginx.conf nginx.conf.proxy
[root@nginx nginx]# cp nginx.conf.bak nginx.conf
[root@nginx nginx]# vim /etc/nginx/nginx.conf
server {
   listen    80;
   server_name localhost;
   #charset koi8-r;
   #access_log logs/host.access.log main;
   location / {
     root  html;
     index index.html index.htm;
     rewrite ^/bbs/(.*)$ http://192.168.18.201/forum/$1;
   }
}

准备forum目录与测试文件

[root@web1 ~]# cd /var/www/html/
[root@web1 html]# ls
index.html
[root@web1 html]# mkdir forum
[root@web1 html]# cd forum/
[root@web1 forum]# vim index.html
<h1>forum page!</h1>

测试一下

nginx的url重写怎么用

好了,下面我们来测试一下rewrite重写。

3.重新加载一下配置文件

[root@nginx 63]# service nginx reload
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
重新载入 nginx:                      [确定]

4.测试一下

nginx的url重写怎么用

注,大家可以从图中看出,status code 302指的是临时重定向,那就说明我们rewrite重写配置成功。大家知道302是临时重定向而301是永久重定向,那么怎么实现永久重定向呢。一般服务器与服务器之间是临时重定向,服务器内部是永久重定向。下面我们来演示一下永久重定向。

5.配置永久重定向

[root@nginx nginx]# vim /etc/nginx/nginx.conf
server {
    listen    80;
    server_name localhost;
    #charset koi8-r;
    #access_log logs/host.access.log main;
    location / {
      root  html;
      index index.html index.htm;
      rewrite ^/bbs/(.*)$ /forum/$1;
    }
}

准备forum目录与测试文件

[root@nginx ~]# cd /usr/html/
[root@nginx html]# ls
50x.html index.html
[root@nginx html]# mkdir forum
[root@nginx html]# cd forum/
[root@nginx forum]# vim index.html
<h1>192.168.18.208 forum page</h1>

6.重新加载一下配置文件

[root@nginx ~]# service nginx reload
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
重新载入 nginx:                      [确定]

7.测试一下

nginx的url重写怎么用

注,大家从图中可以看到,我们访问bbs/是直接帮我们跳转到forum/下,这种本机的跳转就是永久重定向也叫隐式重定向。

相关文章

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

0

2026.03.11

Go高并发任务调度与Goroutine池化实践
Go高并发任务调度与Goroutine池化实践

本专题围绕 Go 语言在高并发任务处理场景中的实践展开,系统讲解 Goroutine 调度模型、Channel 通信机制以及并发控制策略。内容包括任务队列设计、Goroutine 池化管理、资源限制控制以及并发任务的性能优化方法。通过实际案例演示,帮助开发者构建稳定高效的 Go 并发任务处理系统,提高系统在高负载环境下的处理能力与稳定性。

22

2026.03.10

Kotlin Android模块化架构与组件化开发实践
Kotlin Android模块化架构与组件化开发实践

本专题围绕 Kotlin 在 Android 应用开发中的架构实践展开,重点讲解模块化设计与组件化开发的实现思路。内容包括项目模块拆分策略、公共组件封装、依赖管理优化、路由通信机制以及大型项目的工程化管理方法。通过真实项目案例分析,帮助开发者构建结构清晰、易扩展且维护成本低的 Android 应用架构体系,提升团队协作效率与项目迭代速度。

48

2026.03.09

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

93

2026.03.06

Rust内存安全机制与所有权模型深度实践
Rust内存安全机制与所有权模型深度实践

本专题围绕 Rust 语言核心特性展开,深入讲解所有权机制、借用规则、生命周期管理以及智能指针等关键概念。通过系统级开发案例,分析内存安全保障原理与零成本抽象优势,并结合并发场景讲解 Send 与 Sync 特性实现机制。帮助开发者真正理解 Rust 的设计哲学,掌握在高性能与安全性并重场景中的工程实践能力。

216

2026.03.05

PHP高性能API设计与Laravel服务架构实践
PHP高性能API设计与Laravel服务架构实践

本专题围绕 PHP 在现代 Web 后端开发中的高性能实践展开,重点讲解基于 Laravel 框架构建可扩展 API 服务的核心方法。内容涵盖路由与中间件机制、服务容器与依赖注入、接口版本管理、缓存策略设计以及队列异步处理方案。同时结合高并发场景,深入分析性能瓶颈定位与优化思路,帮助开发者构建稳定、高效、易维护的 PHP 后端服务体系。

413

2026.03.04

AI安装教程大全
AI安装教程大全

2026最全AI工具安装教程专题:包含各版本AI绘图、AI视频、智能办公软件的本地化部署手册。全篇零基础友好,附带最新模型下载地址、一键安装脚本及常见报错修复方案。每日更新,收藏这一篇就够了,让AI安装不再报错!

143

2026.03.04

Swift iOS架构设计与MVVM模式实战
Swift iOS架构设计与MVVM模式实战

本专题聚焦 Swift 在 iOS 应用架构设计中的实践,系统讲解 MVVM 模式的核心思想、数据绑定机制、模块拆分策略以及组件化开发方法。内容涵盖网络层封装、状态管理、依赖注入与性能优化技巧。通过完整项目案例,帮助开发者构建结构清晰、可维护性强的 iOS 应用架构体系。

221

2026.03.03

C++高性能网络编程与Reactor模型实践
C++高性能网络编程与Reactor模型实践

本专题围绕 C++ 在高性能网络服务开发中的应用展开,深入讲解 Socket 编程、多路复用机制、Reactor 模型设计原理以及线程池协作策略。内容涵盖 epoll 实现机制、内存管理优化、连接管理策略与高并发场景下的性能调优方法。通过构建高并发网络服务器实战案例,帮助开发者掌握 C++ 在底层系统与网络通信领域的核心技术。

31

2026.03.03

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
【李炎恢】ThinkPHP8.x 后端框架课程
【李炎恢】ThinkPHP8.x 后端框架课程

共50课时 | 4.7万人学习

React 路由精讲视频教程
React 路由精讲视频教程

共10课时 | 2.3万人学习

PHP使用CURL抓取页面
PHP使用CURL抓取页面

共4课时 | 3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号