是否可以用空格(或$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模块的情况下执行此操作。那么,我该怎么做呢?
答案 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)
自动发布从404 Not Found
页到其他页面的重定向通常是一个坏主意-用户可能只是在URL中键入了单个字符(例如,在移动电话上键入了错误,而从,并且有“胖手指”),一旦他们在地址栏中看到404和明显的错字,就很容易纠正,但是如果您的搜索引擎无法投放,则可能需要从头开始。
如果您仍然想这样做,那么在搜索引擎内部进行搜索可能会更有效-毕竟,如果您的搜索引擎无法通过URL进行搜索并纠正错字,那么它听起来像不是一个非常有用的搜索引擎,现在可以了吗?
如果您仍然想在搜索引擎之前的nginx中单独执行此操作,则可以使用以下事实:http://nginx.org/r/rewrite指令实际上可以实现任何类型的DFA-确定性有限自动机—但是,根据所需的替换次数,可能会导致周期过多以及规则集有些不灵活。
请参阅以下资源,以递归方式替换URL中的其他字符: