One other significant difference is that the v2 proxy passes all incoming headers thru by default (including the Host header) and sets the X-Forwarded-For header. In other words, v1’s “transparent” mode is basically the default in v2 (but if you need other headers like X-Real-IP you have to set those yourself). You can still override/customize the Host header using the header_up subdirective.
Websocket proxying “just works” in v2; there is no need to “enable” websockets like in v1.
I’m not familiar with this plugin off-hand, but can look into it this week – or maybe someone else here is more familiar with it and can answer your question.
Functionally, the v1 expires directive allowed for:
A method to match what requests you want to specify expiration for
Dynamic generation of Expires and Cache-Control headers based on provided duration
Currently, in v2, you can replicate some of the functionality right now, just with matchers and the v2 header directive.
The Expires HTTP header is intended to be a fixed datetime after which the response is considered stale. This header can’t easily be replicated dynamically.
However, Cache-Control can be used to hand off the specified duration to the browser, to allow the client to decide dynamically when the content is stale. This part can be done easily in v2.
For example, to state that all .jpg, .jpeg, and .png files should be cached for one day, you would use something like this: