Nginx可以通过rewrite
指令和if
条件判断来实现基于请求参数的请求重写。以下是几种常见的实现方式:
server {
listen 80;
server_name example.com;
location / {
# 检查query参数并重写
if ($arg_param = "value") {
rewrite ^ /new-path? permanent;
}
# 检查多个参数
if ($arg_id ~* "^[0-9]+$" && $arg_action = "delete") {
rewrite ^/old-path /new-path/$arg_id/delete? permanent;
}
}
}
map $arg_param $rewrite_uri {
default "";
"value1" "/new-path1";
"value2" "/new-path2";
}
server {
listen 80;
server_name example.com;
location / {
if ($rewrite_uri) {
rewrite ^ $rewrite_uri? permanent;
}
}
}
server {
listen 80;
server_name example.com;
location / {
try_files $uri @rewrite;
}
location @rewrite {
if ($arg_page = "home") {
rewrite ^ /index.html break;
}
if ($arg_page = "about") {
rewrite ^ /about.html break;
}
# 默认处理
rewrite ^ /404.html break;
}
}
server {
listen 80;
server_name example.com;
location / {
# 匹配id参数为数字的情况
if ($arg_id ~ "^[0-9]+$") {
rewrite ^/product /product.php?id=$arg_id break;
}
# 匹配特定格式的token
if ($arg_token ~* "^[a-f0-9]{32}$") {
rewrite ^/auth /auth.php?token=$arg_token break;
}
}
}
server {
listen 80;
server_name example.com;
location / {
if ($args ~* "param=special") {
rewrite ^/old-path /new-path?$args break;
}
}
}
if
指令在Nginx中有一定的性能开销,应谨慎使用break
标志,外部重定向使用permanent
(301)或redirect
(302)nginx -t
检查语法以上配置可以根据实际需求进行调整,实现基于请求参数的灵活重定向或内部重写。