我试图使用lua直接从nginx服务301重定向,而不是必须通过php或其他东西。块之间共享lua数据?
我这个文章在这里的启发:
的想法是,我可以直接保存重定向的列表Redis的,然后匹配并直接在Nginx的增加性能LUA为他们服务。
因为后端项目的Symfony,我必须找到一种方法来调整一下代码,以满足我的需要,下面是我:
在这里,我尝试匹配通常mysite.com/this /那个请求。我包括LUA脚本首先处理重定向,如果没有比赛我让nginx的try_files
location/{
include /etc/nginx/include.d/lua_st_redis_rewrites.lua;
try_files $uri @rewriteapp;
}
location @rewriteapp {
rewrite ^(.*)$ /app.php/$1 last;
}
因为我想支持开发环境,我要处理的URL像这样还有:mysite.com/app_dev。 php/this/
这些URL不匹配位置/块,因此我必须再次呼叫包含lua。问题是,现在链接mysite.com/this/that实际上将两次调用lua脚本。
我的想法是,我可以在第一次调用中初始化一个真/假标志,然后在第二次调用中使用它来检查脚本是否已包含在内?在这个阶段,我很困惑与然而,变量的作用域:
# pass the PHP scripts to FastCGI server from upstream phpfcgi
location ~ ^/(app|app_dev)\.php(/|$) {
# # Setup var defaults
# set $no_cache "";
include /etc/nginx/include.d/lua_st_redis_rewrites.lua;
# some more usual code for symfony here
}
- 我应该使用全局变量,在这种情况下之间的Lua代码2个街区共享数据?我看到强烈建议不要使用全局变量?
- 如果我包含两次lua脚本,我能否安全地假设脚本中声明的变量每次调用时都会重新声明?
谢谢,我完全不熟悉这个,所以请原谅我明显的问题。
谢谢我将研究ngx.ctx,看起来像我需要的。奇怪的是,include还是像脚本上显示的那样工作,尽管我怀疑你的建议方式可能是更好的方法 – mr1031011
只是一个更新:ngx.ctx只在该特定的请求/子请求中保存值,所以它不起作用对我来说,因为这意味着数据不会在我的示例中的上述2个位置块中共享。所以现在我正在研究使用模块本地foo = require“foo”,但问题是只要nginx工作者仍然活着,模块就会在所有请求中保持数据共享。 – mr1031011