【发布时间】:2021-12-17 21:56:57
【问题描述】:
我想将通过我的 nginx 服务器上的 URL 给出的参数从“my_arg”重写为“my-arg”。问题是我无法预先知道会有多少个论点,也不知道这些论点的位置。 我只能知道参数是否存在使用:
if ($args ~ (.*)my_arg=(.*)) {
rewrite ....
}
但我无法实现只更改此参数的名称而不更改其他所有参数。
提前致谢
【问题讨论】:
标签: nginx mod-rewrite
我想将通过我的 nginx 服务器上的 URL 给出的参数从“my_arg”重写为“my-arg”。问题是我无法预先知道会有多少个论点,也不知道这些论点的位置。 我只能知道参数是否存在使用:
if ($args ~ (.*)my_arg=(.*)) {
rewrite ....
}
但我无法实现只更改此参数的名称而不更改其他所有参数。
提前致谢
【问题讨论】:
标签: nginx mod-rewrite
对于除 HTTP 301/302 重定向之外的任何内容,您最好只更改 $args 变量值:
if ($args ~ (^|.*&)my_arg=(.*)) {
set $args $1my-arg=$2;
}
如果你想生成重定向,事情会更复杂。由于任何rewrite 指令都会针对某些正则表达式模式执行其自己的URI 匹配,因此之前匹配的所有$1、$2 等变量都将被覆盖,并且您无法匹配URI 的查询部分来获取它们重新评估,因为rewrite 指令适用于不包含查询部分的规范化 URI。你唯一的方法是使用named capture groups:
if ($args ~ (?<prefix>^|.*&)my_arg=(?<suffix>.*)) {
rewrite ^ $uri${prefix}my-arg=$suffix? <redirect|permanent>;
}
故意使用尾随问号,因为rewrite 指令文档says,
如果 replacement 字符串包含新的请求参数,则之前的请求参数会附加在它们之后。如果这是不希望的,在替换字符串的末尾放置一个问号可以避免附加它们,例如:
rewrite ^/users/(.*)$ /show?user=$1? last;
【讨论】: