Naming a complex crud function
Abstractions
When working with collections, there are three layers of functions - each essentially justifying a module:
  h(url[], url[]) -&gt; url[]
  g(url, url[])   -&gt; url[]
  f(url1, url2)   -&gt; url

The dependencies are h &lt;- g &lt;- f. The functions at f are more reusable than those at g are more reusable than those at the highest level h.
Complected.
I'll reflect my bias:  If a function is so complex it is hard to name, it might need to be refactored.
The place to start is with a function [let's call it g] that takes one item from redirects and modifies existingRedirects atomically. Then the existing function ensureRedirects can focus on operations at the level of the collection.
Conceptual mangling of the three levels - processing a collection of possible changes versus processing one possible change versus comparing two items - is clear from the description of the ensureRedirects's behavior in the question. A lot of it is at the level of processing a single URL against a collection of URL's even though ensureRedirects operates on collections. Some of it is about dealing with two URL's.
The naming should flow from smaller pieces to larger pieces. Or h could just be redirects.foreach(g)