'(.+)' -- what does this mean? I see why you need '+' (1 or more matches), but why '.'(any char)?
Well, you have one or more matches, but one or more matches of what? In this case, anything. If it's a character, it matches.
Not incidentally, the fact that [ is a character, and so are h, t, p, and /, then the pattern "(.+)" will match the "[/http]" that was supposed to indicate the end of the URL. So if there were two URLs in the line, the entire pattern would only see one (starting with the first [http] and ending with the last [/http). If you don't say otherwise, quantifiers like "+" will attempt to match as much as possible, whereas in this case you only want them to match as much as necessary.
Because of that, the "(.+)" needs to be modified slightly, to "(.+?)", where the "?" makes the necessary change to the behaviour.
'/mi' -- what does this mean?
Multiline matching, case insensitive. Multiline so that ^ and $ anchors match the start and end of every line (instead of just the start and end of the entire string); unnecessary here, since ^ and $ are not being used. Case insensitive, so that the pattern will match [HTTP] as well as [http].
These and other pattern modifiers are covered on this page in the manual.
'$1' -- I assume this references anything in between the pattern limits (start/end) but not included with the pattern?
Everything matched by the part of the pattern between the first set of "()" - in this case, the ".+".