如何替换nginx变量字符串中的字符?

时间:2018-09-06 14:01:16

标签: regex string nginx replace

是否可以用空格(或$request_uri)替换由+返回的非字母数字字符?

我想做的是将我的一个站点中的所有404重定向到它的搜索引擎,其中的查询是请求的uri。因此,我的nginx.conf中有一个包含以下内容的块:

error_page 404 = @notfound;
location @notfound {
    return 301 $scheme://$host/?s=$request_uri;
}

虽然这确实有效,但返回的网址是实际的uri内含-_/个字符,导致搜索始终返回0个结果

例如...输入以下网址:https://example.com/my-articles,重定向最终如下:https://example.com/?s=/my-articles

我想最终(最终)是这样的:https://example.com/?s=my+articles(因此,开头的+也可以正常工作... https://example.com/?s=+my+articles

我需要在没有LUA或Perl模块的情况下执行此操作。那么,我该怎么做呢?

2 个答案:

答案 0 :(得分:0)

您可以使用lua模块,使用lua字符串函数将此变量转换为所需的变量。我正在使用OpenResty,它基本上是启用了lua的nginx。但是nginx lua模块会很好。这是允许您在nginx配置中使用lua的指令。它可以使用content_by_lua_block / access_by_lua_block放置在内部位置,也可以使用content_by_lua_file / access_by_lua_file放置在单独的文件中。这是有关https://github.com/openresty/lua-nginx-module#content_by_lua的文档。 这是我的应用程序中的一个示例。

location ~/.*\.jpg$ {

  set $test '';
  access_by_lua_block {

    ngx.var.test = string.sub(ngx.var.uri, 2)

  }
  root /var/www/luaProject/img/;
  try_files    $uri /index.html;


  }

答案 1 :(得分:0)

  1. 自动发布从404 Not Found页到其他页面的重定向通常是一个坏主意-用户可能只是在URL中键入了单个字符(例如,在移动电话上键入了错误,而从,并且有“胖手指”),一旦他们在地址栏中看到404和明显的错字,就很容易纠正,但是如果您的搜索引擎无法投放,则可能需要从头开始。

  2. 如果您仍然想这样做,那么在搜索引擎内部进行搜索可能会更有效-毕竟,如果您的搜索引擎无法通过URL进行搜索并纠正错字,那么它听起来像不是一个非常有用的搜索引擎,现在可以了吗?

  3. 如果您仍然想在搜索引擎之前的nginx中单独执行此操作,则可以使用以下事实:http://nginx.org/r/rewrite指令实际上可以实现任何类型的DFA-确定性有限自动机—但是,根据所需的替换次数,可能会导致周期过多以及规则集有些不灵活。

    请参阅以下资源,以递归方式替换URL中的其他字符: