---
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) 

# Conditional response

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-11954)
* [  TypeScript ](#tab-panel-11955)
* [  Python ](#tab-panel-11956)
* [  Hono ](#tab-panel-11957)

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 refrom workers import WorkerEntrypoint, Response, fetchfrom 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 handlerapp.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 differentlyapp.post("*", (c) => {  return c.text("Response for POST");});
// Default handler for other methodsapp.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":"TechArticle","@id":"https://developers.cloudflare.com/workers/examples/conditional-response/#page","headline":"Conditional response · Cloudflare Workers docs","description":"Return a response based on the incoming request's URL, HTTP method, User Agent, IP address, ASN or device type.","url":"https://developers.cloudflare.com/workers/examples/conditional-response/","inLanguage":"en","image":"https://developers.cloudflare.com/dev-products-preview.png","dateModified":"2026-04-23","publisher":{"@type":"Organization","name":"Cloudflare","url":"https://www.cloudflare.com/"},"isPartOf":{"@type":"WebSite","@id":"https://developers.cloudflare.com/#website","name":"Cloudflare Docs","url":"https://developers.cloudflare.com/"},"keywords":["Middleware","JavaScript","TypeScript","Python"]}
{"@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"}}]}
```
