将查询参数附加到特定 URI

Appending query parameters to specific URI

我正在尝试将查询字符串 ?sort_by=id&dir=ASC&lim=2&flt=1 附加到任何前往 /admin/users.php 的流量,结果应该是:

/admin/users.php?sort_by=id&dir=ASC&lim=2&flt=1

我试图遵循这个 question/answer:

https://serverfault.com/questions/311487/nginx-rewrite-append-a-parameter-at-the-end-of-an-url

通过执行以下操作:

location /admin/users.php {
  rewrite  ^(.*) ?sort_by=id&dir=ASC&lim=2&flt=1 break;
}

也尝试过:

  location /admin/users.php {
    rewrite  ^ /admin/users.php?sort_by=id&dir=ASC&lim=2&flt=1 last;
  }

但是任何流向 /admin/users.php 的流量都会在没有添加查询字符串的情况下返回。我显然做错了什么。

有什么正确实施的建议吗?


default.conf 的全部内容:

server {
  listen 4000;
  root   /usr/share/nginx/html/src;

  include /etc/nginx/default.d/*.conf;

  index app.php index.php index.html index.htm;

  client_max_body_size 500m;


  location ~ [^/]\.php(/|$) {
    fastcgi_split_path_info ^(.+?\.php)(/.*)$;
    rewrite  ^/admin/?(.*) / break;
    rewrite ^/admin/users.php$ /admin/users.php?sort_by=id&dir=ASC&lim=2&flt=1 break;
    fastcgi_param HTTP_PROXY "";
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_index index.php;
    include fastcgi.conf;
  }
}

由于您正在尝试重写 PHP 文件的 URI,很可能您有一个看起来有点像

的 PHP 处理程序
location ~ \.php$ {
    ...
}

~修饰符指定正则匹配位置,该类型的位置比前缀匹配位置具有更高的优先级(只有带=修饰符的精确匹配位置才比正则表达式具有更高的优先级那些)。此外,您不应该尝试使用附加位置块来执行此操作——使用该方法所能实现的就是无限循环。试试这个:

location ~ \.php$ {
    rewrite ^/admin/users.php$ /admin/users.php?sort_by=id&dir=ASC&lim=2&flt=1 break;
    include fastcgi_params;
    ...
}

更新

您的 PHP 处理程序位置中有两个 rewrite 指令。第一个将从任何以该前缀开头的 URI 中截断 /admin 前缀。第二个将向 /admin/users.php URI 添加额外的查询参数,但它已经被重写为 /users.php。此外,两个 rewrite 指令都有一个 break 标志,这意味着如果执行第一条规则,则永远不会达到第二条。要结合这两个规则,请尝试以下保留 rewrite 指令顺序:

rewrite ^/admin/users.php$ /users.php?sort_by=id&dir=ASC&lim=2&flt=1 break;
rewrite ^/admin/?(.*) / break;