详解Nginx中的Rewrite的重定向配置与实践_nginx

来源:脚本之家  责任编辑:小易  

nginx的正则不支持取反建议是把处理upload,public的location提前loc

一:理解地址重写 与 地址转发的含义。

rewrite ^/IMG/(.+) /ABC/$1 last;其实,这个需求不必用rewrit

地址重写与地址转发是两个不同的概念。

  首先看一个完整代码示例,关于nginx 301 302跳转的。   301跳转设置:  

地址重写 是为了实现地址的标准化,比如我们可以在地址栏中中输入 www.baidu.com. 我们也可以输入 www.baidu.cn. 最后都会被重写到 www.baidu.com 上。浏览器的地址栏也会显示www.baidu.com。

在你配置文件的最后行,不要添加permanent,该参数会发起301重定向你写成last 试试

地址转发:它是指在网络数据传输过程中数据分组到达路由器或桥接器后,该设备通过检查分组地址并将数据转发到最近的局域网的过程。

将以下规则添加到.htaccess文件。gworg.com替换为自己的域名,表示将gworg.com

因此地址重写和地址转发有以下不同点:

小米5X是小米7月26日发布的新品,主打亮点是变焦双摄,外观延续一贯小米设中规中矩,配置上搭载“一代神U”骁龙625处理器,采用14nm制程A53核心主频2.0GHz,仅有4GBRAM+64GBROM唯一组合版本。正面5.5英寸1080P分辨率屏幕,一体化金属机身采用U型天线带。机身厚度7.3mm重量163g,内置3080mAh电池支持5V/2A充电功率。价格为1499元,8月1日10点线上线下同步发售,总的来说性价比是小米老牌了并不出奇,但是依靠小米的营销方式和雷军的号召力,销量应该不会差毕竟还有一帮忠实的米饭。魅蓝note6于8月23日在北京正式发布新机,是魅蓝品牌独立后首次以发布会形式亮

1. 地址重写会改变浏览器中的地址,使之变成重写成浏览器最新的地址。而地址转发他是不会改变浏览器的地址的。

这个问题其实涉及到一个互联网行业的僵硬成见:阿里希望能够推出一款与微信或者QQ相抗衡的社交产品,但是总在社交领域屡战屡败。其实从广义的社交领域来讲,阿里的布局其实并没有人们想象的那么糟糕,比如在典型的具备社交属性的产品中,陌陌和微博是两个表现最好的阿里系产品,两者都在美股完成了上市,并且表现出不错的生命力。陌陌在3月份发布的2016年第四季度的财报显示,净营收同比增524%达2.461亿美元,净利润9150万美元,同比增长674%;而微博的市值早已超过前辈twitter,Q3财报显示,其月活跃用户数为2.97亿,同比增长34%;总营收达11.8亿元,同比增长49%;净利润同比增长156%。值得

2. 地址重写会产生两次请求,而地址转发只会有一次请求。

现在父母都很关注孩子的阅读习惯的培养,所以买书成为育儿花费的主力。那么给孩子买太多书到底好不好,我觉得要看孩子的年龄来界定。0-3岁:孩子在这个时期,一定时间内,不易太多,根据孩子的相应的敏感期,给孩子提供一些图画书和卡片就好。因为这个时期,孩子需要培养专注力,多了反而不好。4-7岁:这个时期,不仅是书,玩具也是,少即是多,这个时期孩子仍然需要保护专注力,但是这个时期也是培养阅读习惯的黄金期,所以可以几个领域各选一本,适当的精简,保证品质,因为孩子在这个时期需要反复的从一本书中去学习,提升理解能力,多了反而会降低孩子的兴趣,很多家长是不是也有感触,家里买了那么多书,孩子都扔一边,根本不看,除了

3. 地址转发一般发生在同一站点项目内部,而地址重写且不受限制。

本人是广西玉林本地人,自同懂事起〈六几年〉就见大人经常吃狗肉,那个年代生活是很是艰苦的。去买什么都要票,布票,粮票,肉票,吃狗肉不用票。所以谁家杀狗,亲戚朋友都来一起吃。后来生活好过了,改革开放了,什么肉,鱼,粮都供大于求了。市场经济活跃了。什么猪,猫,狗市场都有得卖了。吃狗肉就成家常便饭了。你们说玉林人吃狗肉不爱狗,扯谈,好狗我们不会吃的,一条狗出生到养大就知道好不好。好狗自然留下来看家护院。不好的狗就要淘汏,杀掉或卖掉。如果不优生劣汰,过几年就养不起了。一条母狗一年生两至三胎。每胎六条小狗,你们算一下还能养得起吗?狗食都买不起。狗垃尿拉屎特别臭的。所以只留一至两条。每家每户都养有狗。特别是

4. 地址转发的速度比地址重定向快。

二:理解 Rewrite指令 使用

该指令是通过正则表达式的使用来改变URI。可以同时存在一个或多个指令。需要按照顺序依次对URL进行匹配和处理。

该指令可以在server块或location块中配置,其基本语法结构如下:

rewrite regex replacement [flag];

rewrite的含义:该指令是实现URL重写的指令。

regex的含义:用于匹配URI的正则表达式。

replacement:将regex正则匹配到的内容替换成 replacement。

flag: flag标记。

flag有如下值: last: 本条规则匹配完成后,继续向下匹配新的location URI 规则。(不常用) break: 本条规则匹配完成即终止,不再匹配后面的任何规则(不常用)。 redirect: 返回302临时重定向,浏览器地址会显示跳转新的URL地址。 permanent: 返回301永久重定向。浏览器地址会显示跳转新的URL地址。

比如如下列子:

rewrite ^/(.*) http://www.baidu.com/$1 permanent;

说明:

rewrite 为固定关键字,表示开始进行rewrite匹配规则。

regex 为 ^/(.*)。 这是一个正则表达式,匹配完整的域名和后面的路径地址。

replacement就是 http://www.baidu.com/$1 这块了,其中$1是取regex部分()里面的内容。如果匹配成功后跳转到的URL。

flag 就是 permanent,代表永久重定向的含义,即跳转到 http://www.baidu.com/$1 地址上。

下面我们来做个简单的demo来模拟下:

1. 在我们的测试项目下有个app.js. 代码如下:

const Koa = require('koa'); const app = new Koa(); const router = require('koa-router')(); // 添加路由 router.get('/', ctx => { ctx.body = '<h1>欢迎光临index page 页面</h1>'; }); router.get('/home', ctx => { ctx.body = '<h1>欢迎光临home页面</h1>'; }); router.get('/404', ctx => { ctx.body = '<h1>404...</h1>' }); // 加载路由中间件 app.use(router.routes()); app.listen(3001, () => { console.log('server is running at http://localhost:3001'); });

然后在命令行中 运行 node app.js 后,运行,我们就可以在浏览器中 访问 http://localhost:3001 就可以访问到我们对应的页面了。但是现在我想把该node项目部署到我本地的nginx服务器上。nginx安装请看我这篇文章 然后我想使用域名来访问我们的项目,因此我们需要在我们的nginx.conf中配置一下:

cd /usr/local/etc/nginx

然后使用命令:sudo open /usr/local/etc/nginx/nginx.conf -a 'sublime text' 命令打开 nginx.conf 配置如下:

worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; #tcp_nopush on; #keepalive_timeout 0; keepalive_timeout 65; #gzip on; server { listen 8081; server_name localhost; location / { root html; index index.html index.htm; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } server { listen 8088; server_name xxx.abc.com; location / { proxy_pass http://127.0.0.1:3001; rewrite ^/(.*) http://www.baidu.com permanent; } } }

如上代码,我监听端口号是8088,然后server_name 配置设置为 xxx.abc.com, 然后当我们访问 http://xxx.abc.com:8088/的时候,会先反向代理到我们的http://127.0.0.1:3001下的node对应的页面上来,反向代理完成后,会使用 rewrite 重定向百度页面去了。如上配置完成后,我们需要重启下nginx服务器;使用命令:

然后当我们在浏览器访问 http://xxx.abc.com:8088/ 的时候,会执行如下图所示,它会先对 http://xxx.abc.com:8088/ 进行永久重定向(301), 然后会访问百度(307),临时重定向到百度页面来,最终加载百度页面的地址;如下演示所示:

但是如果我把 permanent 改成 redirect 的话,比如nginx配置:rewrite ^/(.*) http://www.baidu.com redirect;后,它就会变成302临时重定向了。如下所示:

三:理解if指令

该指令用来支持条件判断的,并且根据条件判断结果来选择不同的nginx的配置,我们可以在server块或location块中配置该指令,它的语法结构为:

if (condition) { // .... }

condition 是布尔值 true/false的含义。

Rewrite 指令可用的全局变量如下:

1. $args: 该变量中存放了请求URL中的请求指令。比如 http://127.0.0.1:3001?arg1=value1&arg2=value2 中的

"arg1=value1&arg2=value2"。

2. $content_length: 该变量中存放了请求头中的Content-length字段。

3. $content_type: 该变量中存放了请求头中的 Content-type字段。

4. $document_root: 该变量中存放了针对当前请求的根路径。

5. $document_uri: 该变量中存放了请求的当前URI, 但是不包括请求指令。比如 http://xxx.abc.com/home/1?arg1=value1&

arg2=value2; 中的 "/home/1"

6. $host: 变量中存放了请求的URL中的主机部分字段,比如http://xxx.abc.com:8080/home中的 xxx.abc.com.

7. $http_host: 该变量与$host唯一区别带有端口号:比如上面的是 xxx.abc.com:8080

8. $http_user_agent: 变量中存放客户端的代理信息。

9. $http_cookie, 该变量中存放客户端的cookie信息。

10. $remote_addr 该变量中存放客户端的地址。

11. $remote_port 该变量中存放了客户端与服务器建立连接的端口号。

12. $remote_user 变量中存放客户端的用户名。

13. $request_body_file 变量中存放了发给后端服务器的本地文件资源的名称

14. $request_method 变量中存放了客户端的请求方式,比如 'GET'、'POST'等。

15. $request_filename 变量中存放了当前请求的资源文件的路径名。

16. $request_uri 变量中存放了当前请求的URI,并且带请求指令。

17. $query_string 和变量$args含义一样。

18. $scheme 变量中存放了客户端请求使用的协议,比如 'http', 'https'等。

19. $server_protocol 变量中存放了客户端请求协议的版本, 比如 'HTTP/1.0'、'HTTP/1.1' 等。

..... 等等

正则表达式的基本语法:

1. 对变量进行匹配

'~' 表示匹配过程中对大小写敏感。

'~*' 表示匹配过程中对大小写不敏感。

'!~' 如果 '~' 匹配失败时,那么该条件就为true。

'!~*' 如果 '~*' 匹配失败时,那么该条件就为true。

比如如下:

if ($http_user_agent ~ MSIE) { // 代码的含义:$http_user_agent值中是否含有 MSIE 字符串,如果包含为true,否则为false }

2. 判断请求的文件是否存在

'-f' 如果请求的文件存在,那么该条件为true。

'!-f' 如果该文件的目录存在,该文件不存在,那么返回true。如果该文件和目录都不存在,则为false。

如果请求的目录不存在,请求的文件存在,也为false。

if (-f $request_filename) { // 判断请求的文件是否存在 } if (!-f $request_filename) { // 判断请求的文件是否不存在 }

3. 判断请求的目录是否存在使用 '-d' 和 '!-d'

使用 '-d',如果请求的目录存在,则返回true。否则返回false。

使用 '!-d', 如果请求的目录不存在,但是该请求的上级目录存在,则返回true。如果该上级目录不存在,则返回false.... 等等其他一些语法,不多介绍。

现在我们使用if指令来对nginx加一些判断;比如说我们访问http://xxx.abc.com:8080/home时候,如果$host = 'xxx.abc.com' 的时候,就做重定向跳转,nginx配置代码如下:

server { listen 8088; server_name xxx.abc.com; location / { proxy_pass http://127.0.0.1:3001; if ($host = 'xxx.abc.com') { rewrite ^/(.*) http://www.cnblogs.com redirect; } } }

nginx 如上配置,如果我们访问 http://xxx.abc.com:8088 的时候,它就会重定向到 http://www.cnblogs.com 来了。

比如更多的判断,比如如果用户代理是手机访问的话,直接跳转到某个页面去,也可以使用if判断。比如如下:

if ( $http_user_agent ~* "(Android)|(iPhone)|(Mobile)|(WAP)|(UCWEB)" ){ rewrite ^/$ http://www.cnblogs.com permanent; }

四:理解防盗链及nginx配置

什么是防盗链?盗链可以理解盗图链接,也就是说把别人的图片偷过来用在自己的服务器上,那么防盗链可以理解为防止其他人把我的图片盗取过去。

防盗链的实现原理:客户端向服务器端请求资源时,为了减少网络带宽,提高响应时间,服务器一般不会一次将所有资源完整地传回客户端。比如请求一个网页时,首先会传回该网页的文本内容,当客户端浏览器在解析文本的过程中发现有图片存在时,会再次向服务器发起对该图片资源的请求,服务器将存储的图片资源再发送给客户端。但是如果这个图片是链接到其他站点的服务器上去了呢,比如在我项目中,我引用了的是淘宝中的一张图片的话,那么当我们网站重新加载的时候,就会请求淘宝的服务器,那么这就很有可能造成淘宝服务器负担。因此这个就是盗链行为。因此我们要实现防盗链。

实现防盗链:使用http协议中请求头部的Referer头域来判断当前访问的网页或文件的源地址。通过该头域的值,我们可以检测访问目标资源的源地址。如果目标源地址不是我们自己站内的URL的话,那么这种情况下,我们采取阻止措施,实现防盗链。但是注意的是:Referer头域中的值是可以被更改的。因此该方法也不能完全安全阻止防盗链。

使用Nginx服务器的Rewrite功能实现防盗链。

Nginx中有一个指令 valid_referers. 该指令可以用来获取 Referer 头域中的值,并且根据该值的情况给 Nginx全局变量 $invalid_referer 赋值。如果Referer头域中没有符合 valid_referers指令的值的话,$invalid_referer变量将会赋值为1.

valid_referers 指令基本语法如下:

valid_referers none | blocked | server_names | string

none: 检测Referer头域不存在的情况。

blocked: 检测Referer头域的值被防火墙或者代理服务器删除或伪装的情况。那么在这种情况下,该头域的值不以"http://" 或 "https://" 开头。

server_names: 设置一个或多个URL,检测Referer头域的值是否是URL中的某个。

因此我们有了 valid_referers指令和$invalid_referer变量的话,我们就可以通过 Rewrite功能来实现防盗链。

下面我们介绍两种方案:第一:根据请求资源的类型。第二:根据请求目录。

1. 根据请求文件类型实现防盗链配置实列如下:

server { listen 8080; server_name xxx.abc.com location ~* ^.+\.(gif|jpg|png|swf|flv|rar|zip)$ { valid_referers none blocked www.xxx.com www.yyy.com *.baidu.com *.tabobao.com; if ($invalid_referer) { rewrite ^/ http://www.xxx.com/images/forbidden.png; } } }

如上基本配置,当有网络连接对以 gif、jpg、png为后缀的图片资源时候、当有以swf、flv为后缀的媒体资源时、或以 rar、zip为后缀的压缩资源发起请求时,如果检测到Referer头域中没有符合 valid_referers指令的话,那么说明不是本站的资源请求。

location ~* ^.+\.(gif|jpg|png|swf|flv|rar|zip)$ 该配置的含义是 设置防盗链的文件类型。

valid_referers none blocked www.xxx.com www.yyy.com *.baidu.com *.tabobao.com; 可以理解为白名单,允许文件链出的域名白名单,如果请求的资源文件不是以这些域名开头的话,就说明请求的资源文件不是该域下的请求,因此可以判断它是盗链。因此如果不是该域下的请求,就会使用 Rewrite进行重定向到 http://www.xxx.com/images/forbidden.jpg 这个图片,比如这张图片是一个x或其他的标识,然后其他的网站就访问不了你这个图片哦。

2. 根据请求目录实现防盗链的配置实列如下:

server { listen 8080; server_name xxx.abc.com location /file/ { root /server/file/; valid_referers none blocked www.xxx.com www.yyy.com *.baidu.com *.tabobao.com; if ($invalid_referer) { rewrite ^/ http://www.xxx.com/images/forbidden.png; } } }

到此这篇关于详解Nginx中的Rewrite的重定向配置与实践的文章就介绍到这了,更多相关Nginx Rewrite重定向内容请搜索真格学网以前的文章或继续浏览下面的相关文章希望大家以后多多支持真格学网!

扩展阅读,根据您访问的内容系统为您准备了以下内容,希望对您有帮助。

nginx 用rewrite重定向 如何保持url不变

像如

rewrite ^/abc$ http://www.ppp.com:8080/aaa last;

的这种跳转规则,作如下的解释:

如果rewrite指令的第二个参数(replacement)以http或者以https开头,则nginx内部会将该跳转作为临时重定向去处理,表现到http的响应就是会以302响应状态作为响应。

以302,301等的重定向肯定会修改地址栏的url。这个是没办法改变的。

如果不想改变地址栏的url,那可以考虑使用内部跳转:rewrite "/xxx" /abc last;的这种跳转形式。

但是这种重定向只能对站内的url进行重写。

nginx 用rewrite重定向,网址重定向,页面跳转

location ~ /new {

rewrite /new?word=&ie=GBK /ihome/ask?tab=1 permanent;

}

你的URL地址从问号那里起,应该是参数。。。如果是的话你可以用.*来表示问号和他后面的内容。比喻:/new.* 不知道行不行,有问题的话再一起讨论

怎么配置nginx rewrite,才不会引起浏览器url地址重定向

nginx rewrite是必然会是浏览的url改变的。你不想改变应该使用nginx的反向代理,参数为proxy_pass本回答被提问者和网友采纳

怎么配置nginx rewrite,才不会引起浏览器url地址重定向

nginx rewrite是必然会是浏览的url改变的。你不想改变应该使用nginx的反向代理,参数为proxy_pass

采纳哟

  • 本文相关:
  • nginx下301重定向域名的方法小结
  • 详解nginx配置url重定向-反向代理
  • 详解nginx中的重定向功能
  • nginx目录路径重定向的方法
  • nginx地址重定向的方法
  • nginx重定向的配置实例
  • 详解 nginx 301重定向的配置
  • nginx服务器中的重定向配置参考指南
  • nginx 重定向时获取域名的方法示例
  • nginx1.8.0版本平滑升级新版本1.9.7
  • nginx php-fcgi中因php执行时间导致504 gateway timeout错误解决
  • nginx配置多个vue项目
  • nginx 服务绑定域名的方法
  • 详解nginx 301跳转到带www域名方法
  • nginx服务器实现通过ip和user_gent限制访问的方法分析
  • nginx服务器配置文件完全解析
  • nginx访问控制的两种方法
  • 生产环境之nginx高可用方案实现过程解析
  • 详解nginx服务器的配置中开启文件gzip压缩的方法
  • nginx 用rewrite重定向 如何保持url不变
  • nginx 用rewrite重定向,网址重定向,页面跳转
  • 怎么配置nginx rewrite,才不会引起浏览器url地址重定向
  • 怎么配置nginx rewrite,才不会引起浏览器url地址重定向
  • 如何在nginx设置多语言页面,使用rewrite重定向
  • nginx rewrite重定向怎么排除一个目录
  • 关于 nginx rewrite 目录重定向的问题
  • 如何设置301/302重定向
  • nginx的rewrite 跳转后原URL不变,怎么写?
  • nginx服务中https链接重定向问题
  • 网站首页网页制作脚本下载服务器操作系统网站运营平面设计媒体动画电脑基础硬件教程网络安全星外虚拟主机华众虚拟主机linuxwin服务器ftp服务器dns服务器tomcat nginxzabbix云和虚拟化服务器其它首页服务器nginxnginx下301重定向域名的方法小结详解nginx配置url重定向-反向代理详解nginx中的重定向功能nginx目录路径重定向的方法nginx地址重定向的方法nginx重定向的配置实例详解 nginx 301重定向的配置nginx服务器中的重定向配置参考指南nginx 重定向时获取域名的方法示例nginx1.8.0版本平滑升级新版本1.9.7nginx php-fcgi中因php执行时间导致504 gateway timeout错误解决nginx配置多个vue项目nginx 服务绑定域名的方法详解nginx 301跳转到带www域名方法nginx服务器实现通过ip和user_gent限制访问的方法分析nginx服务器配置文件完全解析nginx访问控制的两种方法生产环境之nginx高可用方案实现过程解析详解nginx服务器的配置中开启文件gzip压缩的方法nginx提示:500 internal servernginx 多站点配置方法集合权限问题导致nginx 403 forbiddenginx fastcgi错误primary scripnginx服务器的反向代理proxy_pasnginx 403 forbidden的解决办法nginx伪静态配置和常用rewrite伪nginx下301重定向域名的方法小结详解nginx服务器中配置超时时间的windows下nginx+php5的安装与配置nginx中配置开启nginx status来查看服务器详解nginx平滑升级的过程ngnix在windows下的安装及环境配置(将nginginx 关闭默认站点的方法nginx日志自定义记录以及启用日志缓冲区详详解nginx轮询算法底层实现的方法详解nginx静态服务配置(root和alias指令)nginx实现404页面的方法小结找出nginx配置文件的所在位置的方法详解nginx-rtmp实现直播媒体实时流效果
    免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2017 www.zgxue.com All Rights Reserved