nginx返回301删除一些参数

时间:2017-12-15 22:04:03

标签: redirect nginx http-status-code-301

我正在尝试使用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,但它对我来说没有用。

我有什么想法可以正确地实现这个目标吗?

1 个答案:

答案 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; } 块中允许的语句。