我看过相当类似的帖子,但不是我想要的。我正在尝试实现一个 nginx 重写,它应该修改 get 变量的内容。结果总是 404 未找到,我不明白哪里出了问题。更具体地说,我想要:
https://mydomain.tld/resellers/view.php?id=1&url=https://market.tld重写为: https://resellers.mydomain.tld/view.php?id=1&url=101
因此,有 2 处修改:
- mydomain 更改为 resellers.mydomain
- url 内容更改为数字
我认为应该起作用的配置是:
location ~ /resellers {
rewrite ^/resellers/view.php?id=1&url=https://market.tld https://resellers.mydomain.tld/view.php?id=1&url=101;
}
因为会有多个链接组合,关于 id 和 url 变量,使用重写映射会更好吗?我的意思是,我希望在为 id 和 url 变量创建规则时要明确,而不是使用通配符,就像在更简单的重写规则中一样。
我希望有人曾经遇到过类似的情况,可以给我一些启发。非常感谢您抽出时间。
答案1
指令的正则表达式rewrite
无法匹配 URL 的参数部分。
如果您尝试重定向单个 URI,请使用location =
语法。请参阅这个文件了解详情。
假设参数有多个映射url
,则map
是一个很好的解决方案。请参阅这个文件了解详情。
例如:
map $arg_url $new_url {
default 0;
https://market.tld 101;
}
server {
...
location = /resellers/view.php {
if ($new_url) {
return 301 https://resellers.mydomain.tld/view.php?id=$arg_id&url=$new_url;
}
# URL mapping not found - what to do?
return 404;
}
...
}
请注意,该map
块位于上下文之外server
。