NGINX 在没有 IF 的情况下重写参数?
NGINX rewrite args without an IF?
我想将使用查询参数类型 URL 的遗留链接重写为 URL 的新样式。
例如
example.com/page?id=1
-> example.com/page/1
example.com/otherpage?id=1
-> example.com/otherpage/1
目前我有以下使用 evil if 的配置。
if ($args ~* "id=(.*)") {
set $w1 ;
rewrite .* $scheme://$host/page/$w1? permanent;
}
注意:我使用的是CloudFront,依赖上面的主机header。
如果以上是在服务器块中,没有其他位置块 - 这是否符合 NGINX 配置中 non-evil 使用 if
的条件?另外,上面只支持/page/
。使该部分适用于 otherpage
和其他页面有更好的想法吗?
我看到了其他一些讨论使用地图的想法,但我不太确定如何将它们整合在一起?我在想一些事情:
map $args_id ?? {
default ?
??
}
...
server {
...
???
}
更新:
根据@Ivan 的回答,这是我的最终解决方案:
server {
listen 80;
root /usr/share/nginx/html;
index index.html index.htm;
# Handle legacy requests
if ($args ~* "id=(.*)") {
set $w1 ;
rewrite ^ $scheme://$host$uri/$w1? permanent;
}
}
您的 if
构造并不邪恶。你可以使用像
这样的东西
rewrite ^ $scheme://$host$uri/$w1? permanent;
对于任何页面。如果你想同时处理 example.com/page?id=1
和 example.com/page/?id=1
:
则更复杂的例子
map $uri $maybe_slash {
~/$ "";
default "/";
}
...
server {
...
rewrite ^ $scheme://$host$uri$maybe_slash$w1? permanent;
...
}
我想将使用查询参数类型 URL 的遗留链接重写为 URL 的新样式。
例如
example.com/page?id=1
->example.com/page/1
example.com/otherpage?id=1
->example.com/otherpage/1
目前我有以下使用 evil if 的配置。
if ($args ~* "id=(.*)") {
set $w1 ;
rewrite .* $scheme://$host/page/$w1? permanent;
}
注意:我使用的是CloudFront,依赖上面的主机header。
如果以上是在服务器块中,没有其他位置块 - 这是否符合 NGINX 配置中 non-evil 使用 if
的条件?另外,上面只支持/page/
。使该部分适用于 otherpage
和其他页面有更好的想法吗?
我看到了其他一些讨论使用地图的想法,但我不太确定如何将它们整合在一起?我在想一些事情:
map $args_id ?? {
default ?
??
}
...
server {
...
???
}
更新: 根据@Ivan 的回答,这是我的最终解决方案:
server {
listen 80;
root /usr/share/nginx/html;
index index.html index.htm;
# Handle legacy requests
if ($args ~* "id=(.*)") {
set $w1 ;
rewrite ^ $scheme://$host$uri/$w1? permanent;
}
}
您的 if
构造并不邪恶。你可以使用像
rewrite ^ $scheme://$host$uri/$w1? permanent;
对于任何页面。如果你想同时处理 example.com/page?id=1
和 example.com/page/?id=1
:
map $uri $maybe_slash {
~/$ "";
default "/";
}
...
server {
...
rewrite ^ $scheme://$host$uri$maybe_slash$w1? permanent;
...
}