我有以下configuration,现在将/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”版本的用户redirect到无扩展版本。 什么是最好的方式来configuration?
是在服务器块(如下)重写一个好办法做到这一点?
rewrite ^(.*)/create_user.php?check=true$ $1/create_user/check redirect;
更新:以下configuration更改工作:添加一个地图块:
map $query_string $updated_path { "check=true" "check"; }
并将服务器块中的重写更改为:
rewrite ^(.*/create_user).php$ $1/$updated_path? redirect;
我的做法是这样的:
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的第一部分捕获到$1variables中。 (你真的需要在create_user部分之前匹配任何path吗?)。
然后,在其他location块中,我们匹配create_userurl。 然后我们检查查询参数check包含stringtrue,如果是,我们发送302redirect到用户。
if在这里,我不认为有可能避免使用。 不过,我仍然认为这是一个更有效率的方法。
这里的主要区别是我们不运行每个缺less文件的rewrite指令。
但是,作为最后一点。 我build议在您的应用程序中实现前端控制器模式,以便将所有请求发送到index.php ,然后负责parsingURL。
nginx方面有多less限制,当你达到这个限制时,你必须重build东西。