Masking link with a 302 redirect through nginx not working

spacing asked:

I’m trying to mask an affiliate link, so I want to have a 302 redirect through nginx

I want to redirect all /go links to the respective affiliate link, so all link redirects would be like mydomain.com/go/affiliate redirects to > https://www.affiliatelink.com

Right now this is what I have

location /go {
                rewrite ^/affiliate$ https://www.affiliatelink.com redirect; 
     }

I have tried everything and I cannot seem to be able to get it to work. Is there a specific file I need to do it on?

I have already tried both /sites-enabled/default and /conf.d/nginx.conf

My answer:


Your rewrite doesn’t work because the URL path you are requesting is /go/affiliate but the rewrite matches on the exact path /affiliate, which can never be found in location /go anyway. Fixing that is trivial and obvious, but for performance reasons you should avoid regex whenever possible.

Instead of this sort of rewrite, use one of two alternate approaches:

  1. If you have only a few URL paths to match, use a location for each one:

    location /go/affiliate {
        return 302 https://affiliate.example.com/;
    }
    
  2. If you have a large number of links, I’d say more than 7 or so, use a map instead.

    map $uri $aff_redirect {
        default            "";
        "/go/affiliate"    "https://affiliate.example.com/";
        # more links
    }
    

    A map goes in the http block outside of any server block.

    To use it, check for $aff_redirect variable in the appropriate server block.

    if ($aff_redirect) {
        return 302 $aff_redirect;
    }
    

View the full question and any other answers on Server Fault.

Creative Commons License
This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.