将查询参数附加到特定 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;
我正在尝试将查询字符串 ?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;