############################################################################### # # # Telize 2.0.0 # # Copyright (c) 2013-2018, Frederic Cambus # # https://www.telize.com # # # # Created: 2013-08-15 # # Last Updated: 2018-03-15 # # # # Telize is released under the BSD 2-Clause license. # # See LICENSE file for details. # # # ############################################################################### server { # Configuration variables set $cors "true"; set $cors_origin "*"; server_name 127.0.0.1; # Uncomment when using Telize behind a load balancer # set_real_ip_from 10.0.0.0/8; # Put your load balancer IP range here # real_ip_header X-Forwarded-For; charset_types application/json; keepalive_timeout 0; gzip off; location ~ /ip$ { charset off; default_type text/plain; add_header Cache-Control no-cache; content_by_lua_block { ngx.say(ngx.var.remote_addr) } } location ~ /jsonip$ { charset utf-8; default_type application/json; if ($cors = "true") { add_header Access-Control-Allow-Origin $cors_origin; } content_by_lua_block { local cjson = require "cjson" ngx.header["Cache-Control"] = "no-cache"; local json = cjson.encode({ ip = ngx.var.remote_addr }) local callback = ngx.var.arg_callback if callback then ngx.say(callback, "(", json, ");") else ngx.say(json) end } } location ~ /geoip/?(?.*) { if ($ip = "") { set $ip $remote_addr; } # Uncomment when using Telize behind a load balancer, and # comment the directive setting X-Real-IP # proxy_set_header X-Forwarded-For $ip; proxy_set_header X-Real-IP $ip; proxy_set_header Host $host; proxy_pass $scheme://127.0.0.1/jsonify?callback=$arg_callback; } location /jsonify { charset utf-8; default_type application/json; if ($cors = "true") { add_header Access-Control-Allow-Origin $cors_origin; } set_real_ip_from 127.0.0.1; access_log off; content_by_lua_block { local cjson = require "cjson" ngx.header["Cache-Control"] = "no-cache"; -- Check for invalid IP addresses if ngx.var.remote_addr == "127.0.0.1" then ngx.status = ngx.HTTP_BAD_REQUEST ngx.say(cjson.encode({ code = 401, message = "Input string is not a valid IP address" })) ngx.exit(ngx.HTTP_OK) end local payload = { ip = ngx.var.remote_addr, continent_code = ngx.var.geoip2_continent_code, country = ngx.var.geoip2_country, country_code = ngx.var.geoip2_country_code, country_code3 = ngx.var.geoip2_country_code3, region = ngx.var.geoip2_region, region_code = ngx.var.geoip2_region_code, city = ngx.var.geoip2_city, postal_code = ngx.var.geoip2_postal_code, latitude = ngx.var.geoip2_latitude, longitude = ngx.var.geoip2_longitude, timezone = ngx.var.geoip2_timezone, offset = ngx.var.geoip2_offset, asn = ngx.var.geoip2_asn, organization = ngx.var.geoip2_organization, } -- Validate payload for item, value in pairs(payload) do if payload[item] == "" then payload[item] = nil end end -- Convert latitude and longitude to numeric values if payload.latitude ~= nil and payload.longitude ~= nil then payload.latitude = tonumber(payload.latitude) payload.longitude = tonumber(payload.longitude) end -- Convert timezone offset to numeric value if payload.offset ~= nil then payload.offset = tonumber(payload.offset) end -- Convert ASN to numeric value if payload.asn ~= nil then payload.asn = tonumber(payload.asn) end local json = cjson.encode(payload) local callback = ngx.var.arg_callback if callback ~= "" then ngx.say(callback, "(", json, ");") else ngx.say(json) end } } }