Nginx:将 .php 请求重定向到无扩展名的版本

Nginx:将 .php 请求重定向到无扩展名的版本

我有以下配置,现在重写/create_user/check/create_user.php?check=true

location / {
    try_files $uri $uri/ @ext-php;
}

location @ext-php {
    rewrite ^(.*)/create_user/check$ $1/create_user.php?check=true last;
}

location ~ \.php$ {
    include snippets/fastcgi-php.conf;
    fastcgi_pass unix:/run/php/php7.0-fpm.sock;
}

此外,我想将使用“create_user.php?check=true”版本的用户重定向到无扩展版本。最佳配置方法是什么?

在服务器块中重写(如下所示)是一个好方法吗?

rewrite ^(.*)/create_user.php?check=true$ $1/create_user/check redirect;

更新:以下配置更改有效:添加了地图块:

map $query_string $updated_path {
    "check=true" "check"; }

并将服务器块中的重写更改为:

 rewrite ^(.*/create_user).php$ $1/$updated_path? redirect;

答案1

我对此的解决方法是这样的:

try_files $uri $uri/ =404;

location ~ ^(.*)/create_user/check$ {
    rewrite ^ $1/create_user.php?check=true last;
}

location ~ ^(.*)/create_user.php$ {
    if ($arg_check = "true") {
        return 302 $1/create_user/check;
    }
    include snippets/fastcgi-php.conf;
    fastcgi_pass unix:/run/php/php7.0-fpm.sock;
}

一般来说,最好使用location块来匹配不同的 URL,然后在其中执行您想要的操作。

我在我的答案中将您原来的重写指令更改为第一个location块。我们将 URI 的第一部分捕获到$1变量中。(您真的需要create_user在这里匹配部分之前的任何路径吗?)。

然后,在另一个location块中我们匹配create_userURL。然后我们检查查询参数是否check包含字符串 true,如果包含,我们向用户发送 302 重定向。

我认为这里不可能避免使用if。不过,我仍然认为这是一种更有效的方法。

这里的主要区别是我们不会rewrite对每个丢失的文件运行指令。

但是,最后一点,我建议在你的应用程序中实现前端控制器模式,这样所有的请求都会被发送到index.php,然后由它来解析 URL。

nginx 端能做的事情是有限的,当达到这个限制时,无论如何都必须重建一切。

相关内容