我有一个如下所示的电子邮件验证脚本:
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;
}