gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 02:51:04 25 4
gpt4 key购买 nike

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

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

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

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

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

我想要的是(最终)像这样结束:https://example.com/?s=my+articles(不过,开头的 + 也可以正常工作。 .. https://example.com/?s=+my+articles

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

最佳答案

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

初始捕获 404 的命名位置:

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

命名位置有点限制,所以所有这一切都是将 /search/ 添加到返回 404 的 URI 的开头。 last 标志告诉 Nginx 中断离开当前位置并根据重写的 URI 选择最佳位置来处理请求,因此我们需要一个 block 来捕获它:

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

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

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

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

一旦所有非单词字符都消失,第一次重写将不再匹配,因此请求将传递给下一次重写,从 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"

你明白了..

关于regex - 如何替换 nginx 变量字符串中的字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52205860/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com