我正在尝试使用nginx return 301删除一些参数。
例如,我希望网址重定向为:
https://www.example.com/one?wanted=1&unwanted1=1
- > https://www.example.com/one?wanted=1
https://www.example.com/one?unwanted1=1
- > https://www.example.com/one
https://www.example.com/one?unwanted1=1&unwanted2=2&unwanted3=3
- > https://www.example.com/one
......等等
我使用此代码进行了一些实验(注意它使用重写而不是返回):
if ($request_uri ~ "([^\?]*)\?(.*)unwanted=([^&]*)&?(.*)") {
set $args $2$4;
rewrite "^" $scheme://$host$uri permanent;
}
当仅存在一个不需要的参数时,这很有效。
我试图为每个参数重复它,但现在它不能以最佳方式工作,因为它会执行多个重定向并且不会清理“&”当它不再需要时(只留下一个arg)。
...而且 - 我更愿意使用return 301而不是重写,因为据我所知它会是这种情况下的首选方式。 试图调整最后一行返回301,但它对我来说没有用。
我有什么想法可以正确地实现这个目标吗?
答案 0 :(得分:1)
要以不确定的顺序删除多个不需要的参数,您需要使用某种形式的递归。您的问题包含一个使用外部重定向循环的示例,但遇到了不受欢迎的边缘情况。
可以使用多个process.nextTick(function() { throw err; });
^
TypeError: Right-hand side of 'instanceof' is not callable
at _hasBinary (/usr/local/lib/node_modules/sails/node_modules/has-binary/index.js:31:30)
at hasBinary (/usr/local/lib/node_modules/sails/node_modules/has-binary/index.js:58:10)
at Namespace.emit (/usr/local/lib/node_modules/sails/node_modules/socket.io/lib/namespace.js:214:9)
at Object.broadcastToRoom [as broadcast] (/usr/local/lib/node_modules/sails/node_modules/sails-hook-sockets/lib/sails.sockets/broadcast-to-room.js:74:13)
at child.broadcast (/usr/local/lib/node_modules/sails/lib/hooks/pubsub/index.js:139:23)
at child.publishCreateSingle (/usr/local/lib/node_modules/sails/lib/hooks/pubsub/index.js:1218:14)
at /usr/local/lib/node_modules/sails/lib/hooks/pubsub/index.js:1069:16
at arrayEach (/usr/local/lib/node_modules/sails/node_modules/@sailshq/lodash/lib/index.js:1439:13)
at Function.<anonymous> (/usr/local/lib/node_modules/sails/node_modules/@sailshq/lodash/lib/index.js:3500:13)
at child.publishCreate (/usr/local/lib/node_modules/sails/lib/hooks/pubsub/index.js:1068:11)
at child.wrapper [as publishCreate] (/usr/local/lib/node_modules/sails/node_modules/@sailshq/lodash/lib/index.js:3250:19)
at created (/usr/local/lib/node_modules/sails/lib/hooks/blueprints/actions/create.js:48:19)
at wrapper (/usr/local/lib/node_modules/sails/node_modules/lodash/index.js:3592:19)
at applyInOriginalCtx (/usr/local/lib/node_modules/sails/node_modules/waterline/lib/waterline/utils/normalize.js:421:80)
at wrappedCallback (/usr/local/lib/node_modules/sails/node_modules/waterline/lib/waterline/utils/normalize.js:324:18)
at success (/usr/local/lib/node_modules/sails/node_modules/waterline/node_modules/switchback/lib/normalize.js:33:31)
at _switch (/usr/local/lib/node_modules/sails/node_modules/waterline/node_modules/switchback/lib/factory.js:58:28)
at /usr/local/lib/node_modules/sails/node_modules/waterline/lib/waterline/query/dql/create.js:248:9
at /usr/local/lib/node_modules/sails/node_modules/waterline/node_modules/async/lib/async.js:52:16
at /usr/local/lib/node_modules/sails/node_modules/waterline/node_modules/async/lib/async.js:269:32
at /usr/local/lib/node_modules/sails/node_modules/waterline/node_modules/async/lib/async.js:44:16
at child.<anonymous> (/usr/local/lib/node_modules/sails/node_modules/waterline/lib/waterline/utils/schema.js:152:44)
块清除留下尾随?
和&
的边缘情况。
例如:
if...return
上述工作通过在发生尾随if ($args ~ ^(?:unwanted1|unwanted2)=[^&]*$ ) {
return 301 $uri;
}
if ($args ~ ^(?:unwanted1|unwanted2)=[^&]*(?:&(.*))?$ ) {
return 301 $uri?$1;
}
if ($args ~ ^(.*)&(?:unwanted1|unwanted2)=[^&]*(&.*)?$ ) {
return 301 $uri?$1$2;
}
或尾随?
时处理这两种情况,并使用特制的&
声明进行处理。
以上通过使用外部重定向循环进行工作。
return
也可以执行内部重定向,实现此目的的一种方法是在nginx
块中使用rewrite...last
。
这种情况下的限制是找到位置块,它将处理受不需要的参数影响的URI集。在下面的示例中,我使用了location
块,但您的要求会受到配置中其他location /
块和受影响的URI集的影响。
虽然您已经明确地成功分配了内部location
变量,但我的答案避免了这种技术。
以下示例使用$args
重新实现上一个示例,并添加了一个rewrite...last
块来执行实际的if
。
return 301
请注意,该示例仅使用this document中指示的location / {
if ($args ~ ^(?:unwanted1|unwanted2)=[^&]*$ ) {
rewrite ^ $uri? last;
}
if ($args ~ ^(?:unwanted1|unwanted2)=[^&]*(?:&(.*))?$ ) {
rewrite ^ $uri?$1? last;
}
if ($args ~ ^(.*)&(?:unwanted1|unwanted2)=[^&]*(&.*)?$ ) {
rewrite ^ $uri?$1$2? last;
}
if ($request_uri ~ \?(.*&)?(unwanted1|unwanted2)= ) {
return 301 $uri$is_args$args;
}
try_files $uri $uri/ =404;
}
块中允许的语句。