首页 > 其他分享 >openresty中几种重定向的差异比较(ngx.redirect、ngx.req.set_uri、ngx.exec)

openresty中几种重定向的差异比较(ngx.redirect、ngx.req.set_uri、ngx.exec)

时间:2023-08-26 10:11:08浏览次数:37  
标签:redirect set log .. my location var ngx

一. 测试用的nginx.conf:

 

user root;

worker_processes  1;
error_log logs/error.log;

events {
    worker_connections 1024;
}

http {

    charset       utf-8;
    default_type  application/octet-stream;
	include       /usr/local/openresty/nginx/conf/mime.types;

	rewrite_by_lua_block {
		ngx.log(ngx.ALERT, "(http | rewrite_by)新请求接入,是否内部重定向:" .. tostring(ngx.req.is_internal()))
	}
	access_by_lua_block {
		ngx.log(ngx.ALERT, "(http | access_by)新请求接入,是否内部重定向:" .. tostring(ngx.req.is_internal()))
		ngx.log(ngx.ALERT, "ngx.var.my_var: " .. tostring(ngx.var.my_var))
		ngx.log(ngx.ALERT, "ngx.ctx.my_var: " .. tostring(ngx.ctx.my_var))
	}

    server {
        listen 8080;

		set $my_var "";
		location /redirect {
            rewrite_by_lua_block {
				ngx.log(ngx.ALERT, "(location | rewrite_by | redirect)")
				ngx.var.my_var = "redirect"
				ngx.ctx.my_var = "redirect"
				ngx.redirect("/final")
			}
		}
		location /outside {
            rewrite_by_lua_block {
				ngx.log(ngx.ALERT, "(location | rewrite_by | outside)")
				ngx.var.my_var = "outside"
				ngx.ctx.my_var = "outside"
				ngx.req.set_uri("/final", true)
			}
		}
		location /inside {
            access_by_lua_block {
				ngx.log(ngx.ALERT, "(location | access_by | inside)")
				ngx.var.my_var = "inside"
				ngx.ctx.my_var = "inside"
				ngx.req.set_uri("/final")
			}
			content_by_lua_block {
				ngx.log(ngx.ALERT, "(location | content_by | inside)")
				ngx.header.content_type = "text/html"
				ngx.say("inside: <br>")
				ngx.say("ngx.var.my_var: " .. tostring(ngx.var.my_var) .. "<br>")
				ngx.say("ngx.ctx.my_var: " .. tostring(ngx.ctx.my_var) .. "<br>")
			}
		}
		location /exec {
            access_by_lua_block {
				ngx.log(ngx.ALERT, "(location | access_by | exec)")
				ngx.var.my_var = "exec"
				ngx.ctx.my_var = "exec"
				return ngx.exec('@hide')
			}
		}
		location /mix {
            access_by_lua_block {
				ngx.log(ngx.ALERT, "(location | access_by | mix)")
				ngx.var.my_var = "inside"
				ngx.ctx.my_var = "inside"
				ngx.req.set_uri("/final")
				return ngx.exec('@hide')
			}
		}
		location /final {
			content_by_lua_block {
				ngx.log(ngx.ALERT, "(location | content_by | final)")
				ngx.header.content_type = "text/html"
				ngx.say("final: <br>")
				ngx.say("ngx.var.my_var: " .. tostring(ngx.var.my_var) .. "<br>")
				ngx.say("ngx.ctx.my_var: " .. tostring(ngx.ctx.my_var) .. "<br>")
			}
		}
		location @hide {
			content_by_lua_block {
				ngx.log(ngx.ALERT, "(location | content_by | hide)")
				ngx.header.content_type = "text/html"
				ngx.say("hide: <br>")
				ngx.say("ngx.var.my_var: " .. tostring(ngx.var.my_var) .. "<br>")
				ngx.say("ngx.ctx.my_var: " .. tostring(ngx.ctx.my_var) .. "<br>")
			}
		}
    }

}

 

二. 测试结果

 

标签:redirect,set,log,..,my,location,var,ngx
From: https://www.cnblogs.com/netWild/p/17658418.html

相关文章

  • 安装celery后,提示WARNING/MainProcess...you should set broker_connection_retry_on_
    调用了Celery的config_from_object方法,并新建文件celery_config.py存放设置 在celery中设置broker_connection_retry_on_startup=True 效果没有提示了。 ......
  • promise 并发请求-Promise.all()/Promise.allSettle()
    方法定义//request.js定义exportfunctionall(requests,callback){Promise.all(requests).then(params=>callback(params)).catch(error=>{console.error(error)})}exportfunctionallSettle(requests,callback){Promise.allSettl......
  • cmake中list,set的对字符串操作
    cmake中所有的对象都是string,所以我们对这些的操作就是对字符串的操作,里面提供追加和删除的方法 CMakeLists.txtcmake_minimum_required(VERSION3.15)project(test)#方式二file(GLOBSRC${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp)message("=========================")m......
  • SortedSet实现点赞功能附带排行榜
    SortedSet的基本使用Sortedset也称Zset类型,是一种具有排序效果的set集合。它跟set集合一样也是string类型元素的集合,且不允许重复的成员。并且要求每个元素都会关联一个double类型的分数。后续可以通过分数来为集合中的成员进行从小到大的排序。Sortedset集合是通过哈希表......
  • map.keySet()获取map全部的key值
    用for(Stringkey:params.keySet())读取mapKeySet():将Map中所有的键存入到set集合中。因为set具备迭代器。所有可以迭代方式取出所有的键,再根据get方法。获取每一个键对应的值。keySet():迭代后只能通过get()取keypublicstaticStringgetUrlWithQueryString(Stringurl,......
  • VScode settings.json默认配置文件路径
    LinuxUbuntu:/home/${用户名}/.config/Code/User/settings.jsonWindows:C:\Users\用户名\AppData\Roaming\Code\User来源、参考:https://blog.csdn.net/cyqzy/article/details/130011314......
  • vue3 使用 setup 语法糖时,keep-alive 缓存使用 include / exclude 获取组件名
    <template><router-viewv-slot="{Component,route}"><keep-alive:include="['ComponentName']"><component:is="Component":key="route.name"/></keep-alive>......
  • 20230629 javax.sql.rowset.CachedRowSet
    介绍javax.sql.rowset.CachedRowSetpublicinterfaceCachedRowSetextendsRowSet,JoinableAPIpublicpopulate将指定的结果集中的数据填充到被缓存的行集中execute通过执行使用setCommand方法设置的语句集来填充行集setTableName,getTableName数据库......
  • 20230629 javax.sql.RowSet
    介绍javax.sql.RowSetpublicinterfaceRowSetextendsResultSet行集和ResultSet不同,不需要始终保持与数据库的连接CachedRowSet允许在断开连接的状态下执行相关操作WebRowSet对象代表了一个被缓存的行集,该行集可以保存为XML文件。该文件可以移动到Web应用的其他......
  • 13. 有形资产 Fix Assets
    大部有形分资产都是有使用期限的,那么如何对资产的购入、使用及报废做准确的财务记录呢?购值成本AcquisitionCost1.资本性支出CapitalExpenditure该项计为资产。包括设备购入价、运输费、安装费、调试费等确保设备正常运转起来的费用。2.收益性支出RevenueExpenditure......