繁体   English   中英

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

[英]How to replace characters in an nginx variable string?

有没有办法可以用空格(或+ )替换$request_uri返回的非字母数字字符?

我想要做的是将我的网站之一中的所有 404 重定向到它的搜索引擎,其中查询是请求的uri 所以,我的 nginx.conf 中有一个块,其中包含:

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

虽然这确实有效,但它返回的 url 是实际的uri完整的-_/字符导致搜索始终返回 0 结果

例如...给这个网址: https://example.com/my-articles ,重定向最终是这样的: https://example.com/?s=/my-articles

我想要的是(最终)像这样结束: https://example.com/?s=my+articles ://example.com/?s https://example.com/?s=+my+articles my+articles(不过,开头的 + 也很好用...... https://example.com/?s=+my+articles

我需要在没有 LUA 或 Perl 模块的情况下执行此操作。 那么,我怎样才能做到这一点?

您可能需要根据您希望替换的目录结构向下进行多少调整,但这是基本概念。

初始捕获 404 的命名位置:

location @notfound {
  rewrite (.*) /search$1 last;
}

命名位置有一些限制,所以这一切只是在返回 404 的 URI 的开头添加/search/last标志告诉 Nginx 跳出当前位置并根据重写的 URI,所以我们需要一个块来捕捉:

location ^~ /search/ {
  internal;
  rewrite ^/search/(.*)([^a-z0-9\+])(.*)$ /search/$1+$3 last;
  rewrite ^/search/(.*)$ /?s=$1 permanent;
}

internal指令使该位置只能由 Nginx 进程本身访问,任何客户端对该块的请求都将返回 404。

第一次重写会将最后一个非文本、数字或+字符更改为+ ,然后要求 Nginx 重新评估重写后的 URI。

位置块是用^~修饰符定义的,这意味着匹配这个位置的请求将不会根据任何正则表达式定义的位置块进行评估,所以这个块应该继续捕捉重写的请求。

一旦所有非单词字符都消失了,第一次重写将不再匹配,因此请求将被传递到下一次重写,这将删除 URI 前面的/search并添加查询字符串。

我的日志如下所示:

>> curl -L -v http://127.0.0.1/users-forum-name.1
<<  "GET /?s=users+forum+name+1 HTTP/1.1"

>> curl -L -v http://127.0.0.1/users-forum-name/long-story/some_underscore
<< "GET /?s=users+forum+name+long+story+some+underscore"

你明白了..

您可以使用 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. 404 Not Found页面自动重定向到其他地方通常是一个坏主意——用户可能只是在 URL 中错误输入了一个字符(例如,在移动电话上从传单复制 URL 并且有一个“胖手指” "),一旦他们在地址栏中看到 404 和明显的错字,这将很容易纠正,但如果您的搜索引擎没有提供,则可能需要从头开始。

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

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

    请查看以下有关将 URL 中的给定字符递归替换为其他字符的资源:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM