Rasmus,
That was the first thing I thought of, similar to putting a robots noindex tag on a page and then blocking the crawl in robots.txt
But then I was thinking that if you have a non-canonical inbound link and you 301 it and then put a canonical tag on it, you send a stronger signal that the inbound link is not canonical... but then I couldn't work out the sequence in my head.
The search engine while seeing the header showing the 301 will also grab the content
But that isn't up to the search engine to decide. Yes, Googlebot (and for that matter your browser) will just make a GET request straightaway (essentially will never make a HEAD request), but when the request comes in the server will say "Sorry, not giving you that page. My webmaster told me to give you this one instead."
So Googlebot may *request* the content straightwaway, but it isn't going to *get* it (so to speak) until the server decides it has fully negotiated the request and all the redirects, any content negotiation, etc etc.
So as far as Google knows, the content of
example.com/page?param=random could be 100% different from the page it is 301ed to --
example.com/page. It couldn't and shouldn't make any assumptions about the content of
example.com/page?param=random based on what it finds at
example.com/pageWhich gets me back to thinking that the only purpose of the rel canonical is to say "You may have found and indexed a link that you thought was good, but you have now noticed that you got redirected because that page is permanently moved top here. The reason is because I am the one true page for this content."
But I haven't the slightest clue whether or not Google cares about that second sentence (which is the signal rel canonical would be sending) or that it would add anything to the first sentence