我有以下配置,现在重写/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_user
URL。然后我们检查查询参数是否check
包含字符串 true,如果包含,我们向用户发送 302 重定向。
我认为这里不可能避免使用if
。不过,我仍然认为这是一种更有效的方法。
这里的主要区别是我们不会rewrite
对每个丢失的文件运行指令。
但是,最后一点,我建议在你的应用程序中实现前端控制器模式,这样所有的请求都会被发送到index.php
,然后由它来解析 URL。
nginx 端能做的事情是有限的,当达到这个限制时,无论如何都必须重建一切。