Nginx: allow access only to referrer that match location name
Asked Answered
P

2

13

Is there a way, in nginx, to allow access to a "location" only to clients with a referrer that matches the current location name?

This is the scenario:

http://foooooo.com/bar.org/

http://foooooo.com/zeta.net/

etc etc

I want the contents of the bar.org location available only if the referrer is bar.org. The same goes for zeta.net

I know I can do this "statically", but there are a lot of those locations and I need to find a way to do this defining only one "dynamic" location.

Sorry for my bad english.

SOLUTION

I've solved this way:

location ~/([a-zA-Z0-9\.\-]*)/* {
    set $match "$1::$http_referer";
    if ($match !~* ^(.+)::http[s]*://[www]*[.]*\1.*$ ) {
        return 403;
    }
}
Panteutonism answered 19/9, 2013 at 16:44 Comment(3)
Is there any rule for the location, for example always the string in before the first slash(/). If yes, I have a solution.Crunch
Yes, locations are all in the same format.Panteutonism
OK, I got you. Have a look at my answer. Any question please feel free to comment here.Crunch
C
18
location ~ ^/([a-zA-Z0-9\.\-]*)/(.*) {
    if ($http_referer !~ "^$1.*$"){
            return 403;
    }
}
Crunch answered 20/9, 2013 at 12:38 Comment(1)
Ok, you give me the right way to go, I'll edit my answer to include the code I've used.Panteutonism
M
6
location /india/xxxxx.js {
    if ($http_referer !~ "http://domain.xxx/"){
            return 403;
    }
}

I solved my problem using slight changes, Thanks

Mencher answered 6/11, 2019 at 6:21 Comment(2)
underrated answerTeryn
The only one actually does work correctly.Incest

© 2022 - 2024 — McMap. All rights reserved.