如何在 NGINX 中删除 GET 查询键并使用 GET 值作为 URI?

如何在 NGINX 中删除 GET 查询键并使用 GET 值作为 URI?

我有一个如下所示的电子邮件验证脚本:

http://example.com/v/index.php?t=TOKEN_EMAILED_TO_CLIENT

我希望它看起来像这样:

http://example.com/v/TOKEN_EMAILED_TO_CLIENT

本质上只是删除index.php?t=URL 的一部分,但仍允许 index.php 文件处理令牌。

我尝试了以下三种设置,但均不起作用:

location /v/ {
    try_files index.php$args;
}

上述操作导致 nginx.conf 文件失败

location ^~ /v/ {
    try_files /v/index.php?q=$uri;
}

上述操作导致 nginx.conf 文件失败

location ^~ /v/ {
    rewrite ^/v/index.php?q=(.*)$ $1 permanent;
}

以上代码满足了 nginx.conf 文件的要求,但仍然没有达到我想要的效果。访问时显示 404 错误http://example.com/v/TOKEN_EMAILED_TO_CLIENT

任何帮助将不胜感激。

答案1

首先,^~如果在定义的位置之前没有任何与此模式匹配的正则表达式,则无需使用。您要做的是基本上拥有正确的 URI 并重写它们以将参数传递给您的 php 应用程序。在这种情况下,适当的解决方案是使用重写。

您在此处遗漏的是,您要匹配的 URI 是重写指令的第一个参数,因此它显然无法匹配,^/v/index.php?q=(.*)$因为它等于/v/TOKEN_EMAILED_TO_CLIENT。 重写指令的第二个参数是要重写的 URI。

因此假设您在某个地方有一个处理文件的此类位置.php

location ~ \.php$ {
     [ ... ]
}

那么你需要这个位置块:

location /v/ {
    rewrite ^/v/(.*)$ /v/index.php?t=$1? last;
}

相关内容