nginx 从 request_uri 中提取并将其添加到重定向目标

nginx 从 request_uri 中提取并将其添加到重定向目标

我目前正在使用 nginx 将现有网站的新版本移动到新服务器上,并被告知 URL 需要指向一个新的 PHP 文件来处理如何从新数据库中挑选出日期。

传入 URL 的示例为:

https://testsite.com/test-account-here-ABC-123456.html

这将被 nginx 捕获并重定向到

https://testsite.com/profiles.php

文件将在其中执行其操作并提取 URL 以获取其详细信息并执行搜索。

我已经在 $request_uri 在 url 中找到 **-ABC-* 的前提下设置了一个重定向,如下所示:

if ($request_uri ~ ^/(.*)-ABC-)
{
    return 302 $scheme://testsite.com/profile.php;
}

成功转到该 PHP 文件,但我需要能够从 URL (123456) 中提取数字,以便我可以通过 PHP 文件中的查询字符串访问它们,我尝试使用

return 302 $scheme://testsite.com/profile.php?url=$request_uri;

但这会返回完整的 url,从而导致无限重定向循环和浏览器错误。

有没有什么办法可以提取 $request_uri 的部分内容然后在重定向中重新使用?

类似于

return 302 $scheme://testsite.com/profile.php?url=$variable1;

答案1

如果数字始终位于.html后缀之前,则可以使用此配置:

location ~ ^/.+-ABC-([0-9]+)\.html$ {
    return 302 $scheme://testsite.com/profile.php?url=$1;
}

在 nginx 中,使用location是执行此类操作的首选方式。 告诉~nginx 使用正则表达式匹配来查找位置。 之后和之前的字符串{是实际的正则表达式字符串。

在这里,我们匹配任何以任意字符开头,后跟-ABC-任意数字,然后以.html后缀结尾的字符串。

数字被捕获到一个变量中$1,因为该部分的正则表达式位于括号内。

如果您想进一步阐述正则表达式,网上有很多正则表达式工具可以用来测试您的修改。

相关内容