---
title: Conditional response
description: Return a response based on the incoming request's URL, HTTP method, User Agent, IP address, ASN or device type.
image: https://developers.cloudflare.com/dev-products-preview.png
---

> Documentation Index  
> Fetch the complete documentation index at: https://developers.cloudflare.com/workers/llms.txt  
> Use this file to discover all available pages before exploring further.

[Skip to content](#%5Ftop) 

### Tags

[ Middleware ](https://developers.cloudflare.com/search/?tags=Middleware)[ JavaScript ](https://developers.cloudflare.com/search/?tags=JavaScript)[ TypeScript ](https://developers.cloudflare.com/search/?tags=TypeScript)[ Python ](https://developers.cloudflare.com/search/?tags=Python) 

# Conditional response

**Last reviewed:**  about 4 years ago 

Return a response based on the incoming request's URL, HTTP method, User Agent, IP address, ASN or device type.

If you want to get started quickly, click on the button below.

[![Deploy to Cloudflare](https://deploy.workers.cloudflare.com/button)](https://deploy.workers.cloudflare.com/?url=https://github.com/cloudflare/docs-examples/tree/main/workers/conditional-response)

This creates a repository in your GitHub account and deploys the application to Cloudflare Workers.

* [  JavaScript ](#tab-panel-9256)
* [  TypeScript ](#tab-panel-9257)
* [  Python ](#tab-panel-9258)
* [  Hono ](#tab-panel-9259)

JavaScript

```

export default {

  async fetch(request) {

    const BLOCKED_HOSTNAMES = ["nope.mywebsite.com", "bye.website.com"];

    // Return a new Response based on a URL's hostname

    const url = new URL(request.url);

    if (BLOCKED_HOSTNAMES.includes(url.hostname)) {

      return new Response("Blocked Host", { status: 403 });

    }

    // Block paths ending in .doc or .xml based on the URL's file extension

    const forbiddenExtRegExp = new RegExp(/\.(doc|xml)$/);

    if (forbiddenExtRegExp.test(url.pathname)) {

      return new Response("Blocked Extension", { status: 403 });

    }

    // On HTTP method

    if (request.method === "POST") {

      return new Response("Response for POST");

    }

    // On User Agent

    const userAgent = request.headers.get("User-Agent") || "";

    if (userAgent.includes("bot")) {

      return new Response("Block User Agent containing bot", { status: 403 });

    }

    // On Client's IP address

    const clientIP = request.headers.get("CF-Connecting-IP");

    if (clientIP === "1.2.3.4") {

      return new Response("Block the IP 1.2.3.4", { status: 403 });

    }

    // On ASN

    if (request.cf && request.cf.asn == 64512) {

      return new Response("Block the ASN 64512 response");

    }

    // On Device Type

    // Requires Enterprise "CF-Device-Type Header" zone setting or

    // Page Rule with "Cache By Device Type" setting applied.

    const device = request.headers.get("CF-Device-Type");

    if (device === "mobile") {

      return Response.redirect("https://mobile.example.com");

    }

    console.error(

      "Getting Client's IP address, device type, and ASN are not supported in playground. Must test on a live worker",

    );

    return fetch(request);

  },

};


```

TypeScript

```

export default {

  async fetch(request): Promise<Response> {

    const BLOCKED_HOSTNAMES = ["nope.mywebsite.com", "bye.website.com"];

    // Return a new Response based on a URL's hostname

    const url = new URL(request.url);

    if (BLOCKED_HOSTNAMES.includes(url.hostname)) {

      return new Response("Blocked Host", { status: 403 });

    }

    // Block paths ending in .doc or .xml based on the URL's file extension

    const forbiddenExtRegExp = new RegExp(/\.(doc|xml)$/);

    if (forbiddenExtRegExp.test(url.pathname)) {

      return new Response("Blocked Extension", { status: 403 });

    }

    // On HTTP method

    if (request.method === "POST") {

      return new Response("Response for POST");

    }

    // On User Agent

    const userAgent = request.headers.get("User-Agent") || "";

    if (userAgent.includes("bot")) {

      return new Response("Block User Agent containing bot", { status: 403 });

    }

    // On Client's IP address

    const clientIP = request.headers.get("CF-Connecting-IP");

    if (clientIP === "1.2.3.4") {

      return new Response("Block the IP 1.2.3.4", { status: 403 });

    }

    // On ASN

    if (request.cf && request.cf.asn == 64512) {

      return new Response("Block the ASN 64512 response");

    }

    // On Device Type

    // Requires Enterprise "CF-Device-Type Header" zone setting or

    // Page Rule with "Cache By Device Type" setting applied.

    const device = request.headers.get("CF-Device-Type");

    if (device === "mobile") {

      return Response.redirect("https://mobile.example.com");

    }

    console.error(

      "Getting Client's IP address, device type, and ASN are not supported in playground. Must test on a live worker",

    );

    return fetch(request);

  },

} satisfies ExportedHandler;


```

Python

```

import re

from workers import WorkerEntrypoint, Response, fetch

from urllib.parse import urlparse


class Default(WorkerEntrypoint):

    async def fetch(self, request):

        blocked_hostnames = ["nope.mywebsite.com", "bye.website.com"]

        url = urlparse(request.url)


        # Block on hostname

        if url.hostname in blocked_hostnames:

            return Response("Blocked Host", status=403)


        # On paths ending in .doc or .xml

        if re.search(r'\.(doc|xml)$', url.path):

            return Response("Blocked Extension", status=403)


        # On HTTP method

        if "POST" in request.method:

            return Response("Response for POST")


        # On User Agent

        user_agent = request.headers["User-Agent"] or ""

        if "bot" in user_agent:

            return Response("Block User Agent containing bot", status=403)


        # On Client's IP address

        client_ip = request.headers["CF-Connecting-IP"]

        if client_ip == "1.2.3.4":

            return Response("Block the IP 1.2.3.4", status=403)


        # On ASN

        if request.cf and request.cf.asn == 64512:

            return Response("Block the ASN 64512 response")


        # On Device Type

        # Requires Enterprise "CF-Device-Type Header" zone setting or

        # Page Rule with "Cache By Device Type" setting applied.

        device = request.headers["CF-Device-Type"]

        if device == "mobile":

            return Response.redirect("https://mobile.example.com")


        return fetch(request)


```

TypeScript

```

import { Hono } from "hono";

import { HTTPException } from "hono/http-exception";


const app = new Hono();


// Middleware to handle all conditions before reaching the main handler

app.use("*", async (c, next) => {

  const request = c.req.raw;

  const BLOCKED_HOSTNAMES = ["nope.mywebsite.com", "bye.website.com"];

  const hostname = new URL(c.req.url)?.hostname;


  // Return a new Response based on a URL's hostname

  if (BLOCKED_HOSTNAMES.includes(hostname)) {

    return c.text("Blocked Host", 403);

  }


  // Block paths ending in .doc or .xml based on the URL's file extension

  const forbiddenExtRegExp = new RegExp(/\.(doc|xml)$/);

  if (forbiddenExtRegExp.test(c.req.pathname)) {

    return c.text("Blocked Extension", 403);

  }


  // On User Agent

  const userAgent = c.req.header("User-Agent") || "";

  if (userAgent.includes("bot")) {

    return c.text("Block User Agent containing bot", 403);

  }


  // On Client's IP address

  const clientIP = c.req.header("CF-Connecting-IP");

  if (clientIP === "1.2.3.4") {

    return c.text("Block the IP 1.2.3.4", 403);

  }


  // On ASN

  if (request.cf && request.cf.asn === 64512) {

    return c.text("Block the ASN 64512 response");

  }


  // On Device Type

  // Requires Enterprise "CF-Device-Type Header" zone setting or

  // Page Rule with "Cache By Device Type" setting applied.

  const device = c.req.header("CF-Device-Type");

  if (device === "mobile") {

    return c.redirect("https://mobile.example.com");

  }


  // Continue to the next handler

  await next();

});


// Handle POST requests differently

app.post("*", (c) => {

  return c.text("Response for POST");

});


// Default handler for other methods

app.get("*", async (c) => {

  console.error(

    "Getting Client's IP address, device type, and ASN are not supported in playground. Must test on a live worker",

  );


  // Fetch the original request

  return fetch(c.req.raw);

});


export default app;


```

```json
{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"item":{"@id":"/directory/","name":"Directory"}},{"@type":"ListItem","position":2,"item":{"@id":"/workers/","name":"Workers"}},{"@type":"ListItem","position":3,"item":{"@id":"/workers/examples/","name":"Examples"}},{"@type":"ListItem","position":4,"item":{"@id":"/workers/examples/conditional-response/","name":"Conditional response"}}]}
```
