DEV Community

Rishi Raj Jain
Rishi Raj Jain

Posted on

Block Users from Specific Countries using Hono Ultrafast Web Framework and Vercel Edge Functions

In this tutorial, we'll explore how to block users from specific countries using the Hono Ultrafast Web Framework in conjunction with Vercel Edge Functions. By the end, you'll have a setup in place to filter and handle users based on their country of origin.

Creating a Hono App with Vercel Template

Let's kick things off by setting up a Hono app with the Vercel template. This will serve as the foundation for our country-based blocking feature.



npm create hono@latest my-app


Enter fullscreen mode Exit fullscreen mode

After running the command above, select the Vercel template option.



? Which template do you want to use?

❯   vercel


Enter fullscreen mode Exit fullscreen mode

Then navigate into your app's directory and install the dependencies:



cd my-app
npm i

Enter fullscreen mode Exit fullscreen mode




Obtaining the Request Header

To identify the country of the incoming request, we'll make use of the x-vercel-ip-country header provided by Vercel Edge Functions. Here's how to access this header in your Hono app:



// File: api/index.ts

// ...

app.get('/', (c) => {

// Read more about this header on https://vercel.com/docs/edge-network/headers
const INCOMING_COUNTRY_CODE = c.req.header('x-vercel-ip-country')

// ...

Enter fullscreen mode Exit fullscreen mode




Blocking Users

Now that we have the country code, let's create conditional responses based on the user's country. You can define a list of blocked country codes and handle requests accordingly:



// File: api/index.ts

// ...

const BLOCKED_COUNTRY_CODES = ['US', 'FR']

app.get('/', (c) => {
// ...
if (!INCOMING_COUNTRY_CODE) return c.html(Detected Country: </span><span class="p">${</span><span class="nx">INCOMING_COUNTRY_CODE</span><span class="p">}</span><span class="s2">)

// If the user is from a blocked country, return a specific response
if (BLOCKED_COUNTRY_CODES.includes(INCOMING_COUNTRY_CODE.toUpperCase())) {
return c.html(Detected Country: </span><span class="p">${</span><span class="nx">INCOMING_COUNTRY_CODE</span><span class="p">}</span><span class="s2">, I have blocked users from this country.)
}

// Else, return your actual response
return c.html(Detected Country: </span><span class="p">${</span><span class="nx">INCOMING_COUNTRY_CODE</span><span class="p">}</span><span class="s2">, Redirecting you to our main website...)
})

// ...

Enter fullscreen mode Exit fullscreen mode




Got latency concerns? It's heck fast.

To measure the latency of such a middleware, I measured the performance of the endpoint from different locations, using SpeedVitals Batch Report. Here's what it has to show about it 👇🏻

TTFB Endpoint Around World

Batch Report Link: https://speedvitals.com/result/TZSKWkx9/

The average TTFB being 33ms around the world! One would love to have such a powerful middleware on the edge for such a speed.

You're Done!

With these steps in place, you've learned how to effectively block users from specific countries based on their IP addresses. This can be a valuable feature for enhancing security and user experience on your website.

Top comments (0)